2013-05-09 12 views
5

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.

+0

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

Odpowiedz

4

Książka Design Patterns jest obecnie alfą i omegą wzorów. Jednak nie jest nowy, ale wydaje się, że przeszedł próbę czasu.

Możesz przeczytać szczegółowe przykłady z życia każdego wzoru projektu, jak się ze sobą łączą, jak i kiedy z nich korzystać oraz dokładne wyjaśnienie każdego z nich. Oczywiście zawiera wzór Builder.

W odpowiedzi na twoje pytanie mogę przedstawić moje poglądy, chociaż oczywiście nie są autorytatywne.

Myślę, że jeśli masz niewielką liczbę pól, możesz użyć konstruktora. Jeśli weźmiesz checkstyle, na przykład wystrzeli ostrzeżenie ponad 7 parametrów.

Jeśli wiesz na pewno, że wkrótce przekujesz tę klasę lub będziesz musiał ją przedłużyć, myślę, że wzorzec Konstruktora jest lepszy, ponieważ łatwiej jest go refaktoryzować. Konstruktorzy refaktoryzacji nigdy nie są zabawni.

Jeśli masz ponad 7 parametrów, myślę, że Builder jest znacznie lepszy. Używam go w bieżącym projekcie, nad którym pracuję intensywnie.

Należy pamiętać, że korzystając z wzorca Buildera, nie mówisz: "Dobra, jestem niezmiennym konstruktorem obiektów". Mówisz: "Dobra, buduję sparametryzowane obiekty". Dlatego nie jest problemem, że masz zestaw zmiennych pól w klasie. Jeśli jednak nazwiesz klasę jak ImmutableFooDTO, a później dodasz zmienne pola, spowoduje to zamieszanie.

Więc jeśli istnieje zestaw pól, które nie mogą być zmienne, zaznacz je jako ostateczne i użyj konstruktora/konstruktora, a także podaj zmienne dla zmiennych.

+0

Cześć! Tak, czytałem ekwiwalent Java, ale to wzorzec budowniczego, ponieważ widzisz, że jest trochę mniej ograniczony. To tak naprawdę nie odpowiada na pytanie. Ale dzięki za odpowiedź. –

+0

Proszę spojrzeć na swoje pytanie ponownie: "czy istnieje jakiś standard w tych projektach i jaki jest ich projekt? Jakie są korzyści/odrzucenia?" Odpowiedziałem na twoje pytanie. Nie widzę tam żadnych innych znaków zapytania. –

+0

Cześć, tak, jestem świadomy tego pytania i doceniam twoją odpowiedź. Ale tutaj problemem jest * kiedy * używać tego modelu: * Builder * wyjaśniony powyżej lub argumenty konstruktora, jak radzić sobie z niezmiennymi/zmiennymi polami itp.Nie mogę zaakceptować twojej odpowiedzi tylko dlatego, że łączysz się z książką, która jako taka jest przemysłowa "standardowa", ale wciąż nie obejmuje wszystkich aspektów, o których wspomniałem w moim komentarzu tutaj i w powyższym pytaniu. –

2

Wprowadzam to jako "odpowiedź", więc mam miejsce, aby wyjaśnić, ale to jest naprawdę tylko komentarz do wątku rozpoczętego przez Adama Aroida.

Johan, przede wszystkim zakładam, że mówimy o pozycji 2 w efektywnej Javie.

Zauważ, że to, co jest tam prezentowane, jest formą wzorca Buildera, o którym wspomniał Adam Aroid. Josh Bloch wspomina o tym bezpośrednio, zanim pokaże kod w Effective Java: "Jest to forma wzorca Buildera [Gamma95, s. 97]". (To jest na stronie 13.) Później wspomina o sposobie użycia innego wzoru (z tej samej książki): "Budowniczy, którego parametry zostały ustawione, tworzy piękną fabrykę abstrakcyjną [Gamma95, s. 87].

Johan, pytanie, które sobie zadałeś, jest zbyt szerokie, aby znaleźć tu miejsce.Myślę, że najlepszą odpowiedzią jest odpowiedź Adama Aroid'a.To jest coś, co wymaga pewnego studiowania, a następnie zastosowania tego badania, aby zdobyć pewne doświadczenie.Konferencje w książce Design Patterns bardzo to ułatwiają. będę głosować Adama odpowiedzi up

+0

Dzięki za kredyt. –

-1

Spróbuj z tym kodem.

public static boolean isEmailValid(String email) { 

    boolean isValid = false; 

    String expression = "^[\\w\\.-][email protected]([\\w\\-]+\\.)+[A-Z]{2,4}$"; 
    CharSequence inputStr = email; 

    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE); 
    Matcher matcher = pattern.matcher(inputStr); 
    if (matcher.matches()) { 
     isValid = true; 
    } 
    return isValid; 
}