Sono in una situazione molto particolare con una delle classi che sto codificando. Ho questa classe chiamata User
che assomiglia a questo:Motivi di progettazione - Come applicare gli attributi degli oggetti solo in alcune situazioni (modello Generatore, Iniezione delle dipendenze)
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
}
All'interno mio codice ci sono diverse situazioni in cui ho solo bisogno di un oggetto vuoto di tipo User
e quindi solo costruire utilizzando il costruttore di default: new User()
.
Tuttavia, ho un'altra classe denominata CreateUserRequest
che modella una richiesta REST per creare l'utente in un server. Il payload minimo deve contenere gli attributi name
, password
, email
e authenticationRealm
inviati in formato JSON.
In questo momento sto manipolazione di questo controllando per questi parametri nel costruttore della richiesta:
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.");
}
Questo funziona bene, ma qualcosa è prurito ... vorrei far rispettare questo in un modo più sicuro , in modo che il codice applicasse gli attributi da compilare senza possibilità di generare un'eccezione.
Mi sento come se ci fosse un modo migliore per farlo con un modello di progettazione. Ho pensato di creare una classe UserRequestBuilder
, ma ciò implicherebbe anche la possibilità di lanciare un'eccezione nel metodo build()
(altrimenti, c'è un modo per garantire che gli attributi vengano compilati prima dello build()
?). Iniezione di dipendenza sembra anche una possibilità, ma non sono sicuro di come lo metterei in questo particolare esempio ...
Qualche idea?
Sembra un oggetto diverso, un oggetto CreateUser che magari ha un costruttore e convalida i valori forniti. Qualsiasi motivo devono essere basati sulla stessa classe poiché eseguono due compiti diversi? – dbugger
I miei pensieri immediati sarebbero aggiungere un nuovo metodo isValidUserRequest() sulla classe User. Pensando che la classe User debba decidere da sola se è valida o meno per l'uso in richiesta. –
Grazie per il commento @dbugger. Sì - diverse chiamate REST producono o consumano oggetti JSON con gli stessi attributi della classe 'User' (ad esempio, la classe User rappresenta un'entità remota). Le classi non svolgono realmente compiti diversi. La classe 'CreateUserRequest' crea una chiamata REST che passa un oggetto' Utente' nel suo payload in formato JSON. – Phil