Tak mnie naszło po dzisiejszej dyskusji. Kiedy korzystacie, co preferujecie do tworzenia obiektów?
U mnie to wygląda tak:
public class Pojo {
private static final int DEFAULT_INT_VALUE = -1;
private final String someString;
private final int intValue;
// Podstawowy konstruktor - warto pamiętać,
// żeby liczba wstrzykiwanych pól nie była
// za długa
public Pojo(String someString, int intValue){
// opcjonalnie guard-block
this.someString = someString;
this.intValue = intValue;
}
public Pojo(String someString){
super(someString, DEFAULT_INT_VALUE);
}
// gettery, equals, hashCode i inna magia
public static Pojo fromCSV(String line) throws IllegalArgumentException {
Pojo result = ... // parsowanie i guard-block
return result;
}
public static Pojo fromOtherPojo(OtherPojo otherPojo){
return ... // mapowanie do Pojo etc.
}
public static class Factory {
private final int defaultIntValue;
public Factory(int defaultIntValue){
this.defaultIntValue = defaultIntValue;
}
public Pojo get(String someString){
return new Pojo(someString, defaultIntValue);
}
}
}
Oczywiście jeśli klasa puchnie to rozdzielam je na mniejsze klasy w stylu PojoCSVParser, PojoFactory itd. Jeśli jest potrzeba to dorzucam Buildera.
Mutacje wyżej wymienionego, z którymi się spotkałem:
- konstruktory tylko prywatne, jak chcesz jakiś upublicznić to przez static
- odwrotnie do powyższego - "static Pojo" tylko w oddzielnych klasach
- Factory.get powinno być zawsze bezargumentowe
- w konstruktorach guard-block na nulle
Jak to jest u was? Macie lepsze patenty? Czy też po prostu nie zawracacie sobie tym głowy i jedziecie wszystko Lombokiem?