In generale, mi piace favorire l'immutabilità laddove possibile e non consentire che gli oggetti vengano creati in uno stato non valido o entrino in uno stato non valido. A volte però sembra che potrebbe andare troppo lontano.
Esempio: ho un oggetto dominio utente (entità JPA / Hibernate). Autorizzo solo la costruzione dell'oggetto in uno stato valido, tutti i campi obbligatori devono essere utilizzati per creare un'istanza dell'oggetto e non possono essere NULL
. Su oggetti più grandi, a volte questo può rendere il costruttore rumoroso con un sacco di convalida in corso. In questo caso, sto solo convalidando che gli argomenti non sono nulli. Non sto verificando che il nome utente sia compreso tra 5 e 30 caratteri o qualsiasi altra regola che potrebbe essere associata alle proprietà della classe.
È ragionevole fare quanto segue? Sarebbe sensato fare un ulteriore passo avanti e garantire che gli argomenti soddisfino anche qualsiasi convalida di lunghezza, min, max, formato? O sta facendo un argomento come @Nonnull
abbastanza buono?
Nei casi in cui ci sono setter, dovrebbe essere presente la stessa logica di validazione.
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotBlank
@Column(name = "user_name", unique = true)
private String userName;
@Column(name = "password")
private String password;
@Email
@NotBlank
@Column(name = "email")
private String email;
@Column(name = "locked")
private boolean locked;
@Enumerated(EnumType.STRING)
@Column(name = "role")
private Role role;
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "dealer_id", referencedColumnName = "id")
private Dealer delaer;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<EventLog> events;
protected User() {
this.events = new ArrayList<>();
}
/**
* Constructor for User.
*
* @param userName Username of the user
* @param password Encrypted password
* @param email Email of the user
* @param locked Determines if user account if locked or not
*/
public User(@Nonnull String userName, @Nonnull String password, @Nonnull String email, boolean locked, @Nonnull Role role) {
this();
Preconditions.checkArgument(userName != null);
Preconditions.checkArgument(password != null);
Preconditions.checkArgument(email != null);
Preconditions.checkArgument(role != null);
this.userName = userName;
this.password = password;
this.email = email;
this.locked = locked;
this.role = role;
}
}