Jestem w bardzo szczególnej sytuacji z jedną z klas, które koduję. Mam tej klasy o nazwie User
, który wygląda tak:Wzorce projektowe - jak wymusić atrybuty obiektów tylko w niektórych sytuacjach (wzorzec Konstruktora, iniekcja zależności)
public class User {
private long id; // + getters and setters
private boolean isDeletable; // + getters and setters
private String name; // + getters and setters
private String password; // + getters and setters
private String email; // + getters and setters
private String authenticationRealm; // + getters and setters
private String displayName; // + getters and setters
private Date deletedDate; // + getters and setters
}
ciągu mojego kodu istnieje kilka sytuacji, w których po prostu trzeba pusty obiekt typu User
i dlatego właśnie go zbudować przy użyciu domyślnego konstruktora: new User()
.
Jednak mam inną klasę o nazwie CreateUserRequest
, która modeluje żądanie REST, aby utworzyć użytkownika na serwerze. Minimalne obciążenie musi zawierać atrybuty wysłane w formacie JSON o następujących atrybutach: name
, password
, email
i .
Teraz jestem obsługi to poprzez sprawdzenie tych parametrów konstruktora życzenie:
public CreateUserRequest(User user) {
if(user.getName() == null || user.getPassword() == null || user.getEmail() == null || user.getAuthenticationRealm() == null)
throw new RuntimeException("Not enough attributes in User object. Minimum: name, password, e-mail and authentication realm.");
}
To działa OK, ale coś jest swędzenie ... Chciałbym, aby egzekwować to w bezpieczniejszy sposób , aby kod wymusił zapełnianie atrybutów bez możliwości zgłaszania wyjątku.
Czuję, że musi istnieć lepszy sposób na zrobienie tego za pomocą wzoru. Pomyślałem o utworzeniu klasy UserRequestBuilder
, ale to również prawdopodobnie oznaczałoby odrzucenie wyjątku w metodzie build()
(w przeciwnym razie czy jest sposób, w jaki mogę zagwarantować, że atrybuty zostaną wypełnione przed build()
?). Wstrzyknięcie zależne od zależności również brzmi jak możliwość, ale nie jestem pewien, w jaki sposób umieściłbym go w tym konkretnym przykładzie ...
Jakieś myśli?
Brzmi jak inny obiekt, obiekt CreateUser prawdopodobnie ma konstruktor i sprawdza poprawność dostarczonych wartości. Jakieś powody, dla których muszą być oparte na tej samej klasie, ponieważ wykonują dwa różne zadania? – dbugger
Moje natychmiastowe myśli byłyby dodanie nowej metody isValidUserRequest() w klasie użytkownika. Myśląc, że klasa Użytkownika powinna sama zdecydować, czy jest ona ważna, czy nie, aby użyć jej na żądanie. –
Dzięki za komentarz @dbugger. Tak - kilka wywołań REST generuje lub zużywa obiekty JSON z tymi samymi atrybutami klasy "Użytkownik" (tj. Klasa użytkownika reprezentuje zdalny obiekt). Klasy tak naprawdę nie wykonują różnych zadań. Klasa "CreateUserRequest' buduje wywołanie REST, które przekazuje obiekt' User' w swoim ładunku w formacie JSON. – Phil