Tak więc czytałem część Efektywna Java! I jedną z najbardziej inspirujących części tej książki jest sekcja Niezmienny obiekt/budowniczy, w której Bloch pisze o "Builderze" - klasie zamiast tylko POJO.Projektowanie obiektów Java Model
UWAGA: mówię o modelu obiektów tutaj: jak na przykład w art lub Car.
to jak pisałem te obiekty przed:
public class Car {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Teraz, jak widać ten projekt jest uboga w wiele sposobów, wymaga zmienność i trzeba budować obiekt z pierwszego konstruktora następnie ustawienie imię.
Teraz oczywiście możesz ustawić pole name
jako ostateczne i użyć go jako argumentu w konstruktorze, ale jeśli masz duży obiekt zawijający, na przykład pewną liczbę tabel SQL, to będziesz miał brzydkiego konstruktora w następujący sposób:
public Car(int horsepowers, String name, String brand, int yearManufactured,
User owner, List<User> previousOwners) {
//Set the values
}
To staje się nieczytelne podczas tworzenia obiektu, a to tylko sześć pól!
Więc Bloch sugeruje następujące (przy niezmienności)
public class Car {
public static class Builder {
private String name;
public Builder setName(String name) {
this.name = name;
return this;
}
public Car build() {
reeturn new Car(this);
}
}
private final String name;
private Car(Builder builder) {
name = builder.name;
}
public String getName() {
return name;
}
}
//Construction example
Car car = new Car.Builder().setName("Speedy").build();
Teraz to daje nam niezmienność! A jeśli masz jakieś obiekty, które nie są prymitywne lub niezmienne, po prostu skopiuj je w setterach Builder
i skopiuj je ponownie w przyrostkach Car
.
Ale jest bardzo rozwlekły i używałam argumentów konstruktora, jeśli klasa jest wystarczająco mała. Jeśli klasa potrzebuje zmiennego pola, po prostu zmienię to pole, jeśli klasa ma wystarczające właściwości (> 4 coś).
Innym problemem jest praca z Androidem, a klasa ma na przykład Bitmap
, wtedy należy zwrócić rzeczywistą bitmapę, a nie skopiować, ponieważ jest to raczej wydajność - droga.
Widziałem mnóstwo pytań takich jak ten, ale nie mogę znaleźć dobrej odpowiedzi na to pytanie: czy jest tam jakiś standard tych wzorów i jak są one zaprojektowane? Jakie są korzyści/defeceity?
Z góry dziękuję!
EDIT:
Pytanie brzmi:
Jaki jest najlepiej sposób skonstruować model obiektu, który powinien być niezmienny i z a) małą liczbę pól oraz b) duża Liczba pól? Jak poradzić sobie z wyżej wymienionym numerem Bitmap
i podobnymi problemami? Czy niektóre pola są zmienne?
Przepraszamy za bycie niejasnym.
myślę punkt 'Builder' jest, gdy masz do czynienia z niezmienne obiekt z pewnymi wymaganymi i opcjonalnymi polami. Ponieważ zadeklarowałbyś pola jako "ostateczne". Nie dotyczy to każdego projektu. – Sam