Klasy i interfejsy - rlip/java GitHub Wiki

Interfejsy

Wszystkie metody są publiczne. Poza zwykłymi metodami w interfejsie mogą się znajdować:

  • metody domyślne,
  • metody statyczne,
  • stałe.

Dostępność

  • trzeba tworzyć możliwie mało dostępne klasy lub składniki
  • oprócz publicznych pól statycznych typu final klasy publiczne nie powinny posiadać pól publicznych
  • tablice nie mogą być publicznym polem final, bo można je modyfikować. Lepiej użyć tablicy niemodyfikowalnej, albo zmienić dostęp do tablicy na prywatny i dodać publiczną metodę zwracającą kopię tablicy prywatnej.
public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
-----------
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}

Akcesory i mutatory (get, set)

Klasy publiczne nie powinny nigdy udostępniać pól modyfikowalnych. Mniej szkodliwe, choć nadal wątpliwe jest udostępnianie pól niemodyfikowalnych przez klasy publiczne. Czasami korzystne jest udostępnianie pól przez klasy prywatne dla pakietu lub klasy prywatne zagnieżdżone, niezależnie od tego, czy są one modyfikowalne, czy nie.

Klasy niezmienne

Nie ulegaj pokusie napisania metody set dla każdej metody get. Klasy powinny być niezmienne, chyba że istnieją poważne powody, aby były one modyfikowalne. Klasy niezmienne posiadają wiele zalet i ich jedyną wadą są potencjalne problemy z wydajnością w niektórych okolicznościach. Jeżeli klasa nie może być niezmienna, powinieneś ograniczyć możliwość modyfikowania takiego obiektu tak mocno, jak tylko jest to możliwe. Każde pole powinno być oznaczone private final, chyba że istnieją dobre powody, aby tak nie robić. Reguły:

  1. Nie twórz żadnych metod modyfikujących obiekt,
  2. Upewnij się, że klasa nie może zostać rozszerzona.
  3. Wszystkie pola jako final i private
  4. Jeżeli Twoja klasa posiada jakieś pola, które odwołują się do modyfikowalnych obiektów, zapewnij, że klienty klasy nie będą mogły odczytać referencji do tych obiektów.
// Niezmienna klasa liczby zespolonej
public final class Complex {
   private final float re;
   private final float im;
   public Complex(float re, float im) {
      this.re = re;
      this.im = im;
   }
   // akcesory bez odpowiadających im mutatorów
   public float realPart()      { return re; }
   public float imaginaryPart() { return im; }
   public Complex plus(Complex c) {
      return new Complex(re + c.re, im + c.im);
   }
⚠️ **GitHub.com Fallback** ⚠️