Использование сеттеров в конструкторе класса сущностей

1

У меня есть этот класс сущности (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 для постоянного атрибута не должен быть окончательным".

Конечно, я могу присвоить поле, но сеттер выполняет проверку, которую я не хочу реплицировать в конструкторе.

Любой способ сделать это правильно?

Теги:
constructor
setter

3 ответа

0
Лучший ответ

Использовать статический заводский метод

@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;
    }

}

Этот метод нельзя вызывать из конструктора подкласса, поэтому не будет предупреждений о переопределяемом сетевом устройстве.

  • 0
    Да, фабрика будет работать нормально. Интересно, что, очевидно, нет правильного способа использования сеттеров в конструкторах в классе сущностей. Я тоже проверю валидацию бобов.
0

Ваша реализация не является неправильной. Но вы можете напрямую обращаться к своим переменным в конструкторе. И вы также можете использовать "шаблон конструктора телескопов". См. Образец,

@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

}
  • 0
    Но это не решает вопрос. Я хочу использовать сеттеры в логике создания объекта, потому что проверка правильности аргументов передана.
0

То, как вы делаете в настоящее время, также прекрасно, просто игнорируйте предупреждение и продолжайте. (И я не могу оставлять комментарии, почему я поставил ответ)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню