У меня есть этот класс сущности (Netbeans 8):
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public User() {}
public User(String name) {
this.setName(name);
}
public void setName(String name) {
this.name = name;
}
}
Компилятор предупреждает меня о том, что я не должен вызывать переопределяемые методы в конструкторе, и я понимаю причины этого.
Я не могу сделать класс окончательным, потому что является сущностью, и делает окончательный выпуск сеттера предупреждением о том, что "Метод setter для постоянного атрибута не должен быть окончательным".
Конечно, я могу присвоить поле, но сеттер выполняет проверку, которую я не хочу реплицировать в конструкторе.
Любой способ сделать это правильно?
Использовать статический заводский метод
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public User() {}
public static User createUser(String name) {
User result = new User();
result.setName(name);
return result;
}
public void setName(String name) {
this.name = name;
}
}
Этот метод нельзя вызывать из конструктора подкласса, поэтому не будет предупреждений о переопределяемом сетевом устройстве.
Ваша реализация не является неправильной. Но вы можете напрямую обращаться к своим переменным в конструкторе. И вы также можете использовать "шаблон конструктора телескопов". См. Образец,
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private int age;
public User() {}
public User(String name) {
this(name, age);
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
//getters and setters
}
То, как вы делаете в настоящее время, также прекрасно, просто игнорируйте предупреждение и продолжайте. (И я не могу оставлять комментарии, почему я поставил ответ)