2008-12-17 13 views
8

Niedawno pracowałem nad ostrzeżeniami FindBugs o ujawnianiu stanu wewnętrznego, tj. Gdy zwracano odwołanie do tablicy zamiast zwracania kopii tablicy. Stworzyłem kilka szablonów, aby ułatwić konwersję tego kodu.Szablony edytora dla programowania defensywnego

Który z nich stworzyłeś, aby obsługiwać programowanie defensywne i chcesz dzielić się z tłumem SO?

Szablony że utworzone pory (przykłady):

utworzenia kopii tablicy powrotu na metodzie:

Klonowanie obiekt:

(${o}!= null?(${type})${o}.clone():null) 

Odpowiedz

3

Lubię mieć jako szablon do „bezpieczniej” jest równy() Definicja:

/** 
* Implement equals based on ${cursor}. <br /> 
* See {@link #compareTo(Object) compareTo} 
* @see java.lang.Object#equals(java.lang.Object) 
*/ 
public boolean equals(final Object anObject) 
{ 
    boolean res = false; 
    if(anObject == null) { return false; } 
    if(anObject == this) { return true; } 
    if(anObject.getClass() == this.getClass()) 
    { 
     res = this.compareTo(anObject) == 0; 
    } 
    return res; 
} 

aby upewnić się zawsze unikać EQ: równa metoda zastępuje równa w nadrzędnej i nie mogą być symetryczne (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC) , gdzie:

Ta klasa definiuje metodę równą, która zastępuje metodę równą w nadklasie. Obie metody są równe metodom instanceof przy określaniu, czy dwa obiekty są równe.

Jest to obarczone ryzykiem, ponieważ ważne jest, aby metoda równa była symetryczna (innymi słowy, a.equals(b) == b.equals(a)).
Jeśli B jest podtypem A i A jest równa kontrole metoda, że ​​argument jest instanceof A i B jest równa metoda sprawdza, czy argument jest instanceof B, to jest całkiem prawdopodobne, że relacja równoważności określone przez tych metod nie jest symetryczny.


To jest tylko dla klas realizujących Comparable i pozwala na:

  • implementacja równych który jest zawsze taki sam;
  • wszystkie logiki porównania mają być zlokalizowane tylko w jednym miejscu (funkcja compareTo());
  • Zgodność z javadoc z Comparable#compareTo() z prośbą o zapewnienie, że (x.compareTo(y)==0) == (x.equals(y)) (zdecydowanie zalecane, ale nie jest ściśle wymagane).
+0

Chciałbym odwrócić inicjalizację "boolean res" i test równości klas. Następnie kod "else" może zostać przeniesiony do klauzuli "then". Myślę, że to ułatwia zrozumienie wtedy i mniej podatności na błędy. –

+0

@Randy: szablon naprawiony – VonC

+0

Ale ten szablon działa tylko wtedy, gdy klasa implementuje porównywalne, prawda? Czy wszystkie zajęcia są porównywalne? Jeśli tak, jakie są korzyści i czy warto to opłacić? – dhiller

2

Nie szablon, ale używam array.clone() zamiast System.arraycopy(). Czy coś jest z tym nie tak?

Edycja: Wzór korzystać przy wykonywaniu dekorator, zwłaszcza dla styku z wielu metod:

wrapped.${enclosing_method}(${enclosing_method_arguments}) 

generuje wdrożenia obecnego sposobu poprzez przekazanie połączenia do owiniętego przykład, w ten sposób zapobiegając błędy kopiowania/wklejania.

+0

Klon na tablicy jest w porządku.klon na niezaufanym, nieostatecznym obiekcie jest problemem, ponieważ klon może zostać przesłonięty, aby zrobić coś nieprzyjemnego/głupiego. –

+0

Czy to różni się od metody generowania delegatów/generowania? –

+0

Tak więc złośliwie zakodowana podklasa java.util.Date mogłaby zastąpić operację clone(), aby zrobić kilka nieprzyjemnych rzeczy, prawda? Jeśli tak, powinienem odpowiednio dostosować szablon klonu ... Jakieś sugestie? – dhiller

Powiązane problemy