Czwarta część kursu „Eclipse w praktyce” traktuje o automatycznej generacji kodu wewnątrz edytora. Na początek dowiemy się, jak wykorzystywać wbudowane mechanizmy tworzenia kodu, a potem poznamy, jak definiować własne szablony.
Uwaga: niektóre przykłady skrótów klawiaturowych wymagają wprowadzenia zmian w konfiguracji Eclipse.
1. Generacja kodu
public class GettersSetters {
private String name;
}
Alt S – generowanie Getterów i Setterów (zob. Proponowane zmiany w skrótach klawiaturowych)
Dla danego kodu wywołujemy Alt S.
Wybieramy pola, do których chcemy utworzyć gettery i settery, w tym przypadku name.
public class GettersSetters {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Shift Alt S › Generate Constructor using Fields
Tworzy konstruktor przypisujący wartości swoich parametrów odpowiednim polom klasy.
public class GettersSetters {
private String name;
public GettersSetters(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Shift Alt J › generate JavaDoc
Wstawia porządnego JavaDoca. Np. dla danej metody (kursor na nazwie metody):
public int max(int a, int b) {
return a > b ? a : b;
}
Wygeneruje coś takiego:
/**
* @param a
* @param b
* @return
*/
Bardzo przydaje się podczas dziedziczenia lub implementacji interfejsu. Nie musimy wtedy kopiować komentarzy z interfejsu, gdyż Shift Alt J wstawia taki komentarz:
/* (non-Javadoc)
* @see cl.use.of.eclipse.CodeAssist#max(int, int)
*/
Osobiście wolę inną templatkę, wstawiającą prawdziwy JavaDoc. Aby ją zmienić:
Window › Preferences › Java › Code Style › Code Templates › Comments › Overriding methods
Wstawiamy tam:
/**
* ${see_to_overridden}
*/
Shift Alt S › Generate Delegate Methods
public class DelegateTest {
String sb;
}
Kursor na polu sb. Wywołujemy generację metod delegujących.
Zaznaczamy tylko metodę length().
Otrzymujemy metodę delegującą:
public class DelegateTest {
String sb;
public int length() {
return sb.length();
}
}
Shift Alt S › Override/Implement Methods
public class DataSet extends HashSet {
}
Kursor na DataSet, wybieramy Override/Implement Methods. Wybieramy metodę HashSet.add():
public class DataSet extends HashSet {
public boolean add(Object arg0) {
// TODO Auto-generated method stub
return super.add(arg0);
}
}
Shift Alt S › Generate hashCode() and equals()
public class HashEquals {
private String name;
}
Dzięki tej funkcji otrzymamy następujący kod:
public class HashEquals {
private String name;
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final HashEquals other = (HashEquals) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
Ctrl I – correct Indentation
Wstawia automatycznie wcięcia w zaznaczonym kodzie.
Ctrl Shift F – Format code
Porządkuje kod, wstawia wcięcia, ale potrafi narobić bałaganu w komentarzach.
Window › Preferences › Java › Editor › Templates
Własne szablony kodu są bardzo przydatną cechą Eclipse’a. Przyspieszają pisanie kodu i eliminują pojawienie się przypadkowych błędów. By je wywołać wystarczy wpisać ich nazwę i nacisnąć Ctrl Space.
Poniżej przedstawiam parę stworzonych przeze mnie szablonów do kodu wpisującego odpowiednie informacje do logów. Do prezentacji użyję metody:
public String concat(String s1, String s2) {
return s1 + s2;
}
ld – log.debug
log.debug(„${enclosing_method} ${cursor}”);
Wynik:
log.debug(„concat |„);
Szablon rozwija kod, zamieniając zmienne ${…} na odpowiednie wartości. I tak ${enclosing_method} wprowadza nazwę aktualnej metody, a ${cursor} ustawia kursor w podanym miejscu.
lvar – log variable
log.debug(„${enclosing_method} ${name} = „ + ${cursor}${name});
Wynik:
log.debug(„concat name = „ + name);
Pozwala wpisać do loga wartość zmiennej. Zaraz po wpisaniu lvar i Ctrl Space, można w rozwiniętym kodzie wpisywać nazwę zmiennej, która zostanie podstawiona w obydwu podświetlonych miejscach.
le1 – log entry for method with 1 parameter
log.debug(„${enclosing_method}(„ + ${cursor}${enclosing_method_arguments} + „)”);
W metodzie:
public void test(int x) {
}
daje wynik:
log.debug(„test(„ + x + „)”);
Szablon do zastosowania przy wejściu do metody. Niestety, nie działa dla większej liczby parametrów, dlatego stworzyłem kolejny szablon:
lent – log entry
log.debug(„${enclosing_method}(„ + cl.process.common.StringUtils.commaSepar(new Object[] {${cursor}${enclosing_method_arguments}}) + „)”);
Wynik dla metody concat(String s1, String s2):
log.debug(„concat(” + cl.utils.StringUtils.commaSepar(new Object[] { s1, s2 }) + „)”);
Dzięki zastosowaniu StringUtils.commaSepar(), nie potrzebujemy samodzielnie wstawiać do stringa przecinków między logowanymi argumentami.
Oto kod tej metody:
public static String commaSepar(Object[] objects) {
StringBuffer sb = new StringBuffer();
if (objects != null) {
for (int i = 0; i < objects.length; i++) {
Object obj = objects[i];
if (i > 0) {
sb.append(„, „);
}
sb.append(obj);
}
} else {
sb.append(„null”);
}
return sb.toString();
}
log_block – log around block of code
log.debug(„${enclosing_method} ${name} start”);
${line_selection}
log.debug(„${enclosing_method} ${name} koniec”);
Zaznaczamy dowolny fragment kodu wewnątrz metody, wciskamy Shift Alt Z i wybieramy log_block. Zaznaczony fragment otrzymuje po jednej linijce loga na początku i na końcu. Dodatkowo, podobnie jak w lvar, możemy nazwać komentowany fragment.
Autor: Dominik Kapusta
Tagi: Eclipse

„Ctrl Shift F – Format code
Porządkuje kod, wstawia wcięcia, ale potrafi narobić bałaganu w komentarzach.”
Rozwiązaniem jest użycie w javadocu (nie mylić z ). „Ctrl Shift F” respektuje oznaczone w ten sposób nasze preferencje co do miejsc złamania linii. Przy zwykłym komentarzu następuje tylko złamanie zbyt długich linii, więc ręcznie stworzony posział zostanie zachowany.