2013-03-07 2 views
5

Некоторые классы Java должны иметь приватные свойства с открытым геттером и сеттером, чтобы нормально функционировать. Например, им нужны JSF-бобы и объекты JPA. Если бы не эти библиотеки, возможно, есть некоторые свойства, которые не должны иметь никаких геттеров и определенно не устанавливаться. Также пустые конструкторы часто обескуражены для использования пользовательским кодом. НапримерОтклоненный метод, не устаревший

@Entity 
public class MyEntity implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    public MyEntity() {} 

    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
} 

В этом классе метод setId никогда не должен вызываться с помощью ручного кода. Этот метод не является устаревшим, поэтому аннотация @Deprecated будет неправильной.

Есть ли другой способ, чем @ Не рекомендуется использовать метод, который нельзя использовать?

+0

Этот вопрос не связан с JSF и JPA. Тем не менее, стоит упомянуть эти рамки. –

+0

Ваш пример не очень хорош. Почему бы вам когда-либо препятствовать использованию сеттера в этом случае? Объект объекта, который может потенциально хранить всевозможные комбинации данных, вы, конечно же, хотите установить его значения. – Perception

+0

Вы не хотите изменять свой уникальный идентификатор после его инициализации. –

ответ

3

Субъектам JPA не нужны публичные геттеры и сеттеры. Значения задаются с использованием отражения (по крайней мере, при использовании EclipseLink или Hibernate, которые вы, вероятно, используете).

В этом конкретном примере вы можете просто выйти из сеттера, я сделал из него привычку и никогда не сталкивался с проблемой. Примечание. Придерживайтесь соглашений об именовании Java, когда речь идет о свойствах и геттерах/сеттерах. Некоторые библиотеки/рамки (ошибочно imo) зависят от этого.

Что касается глобальной концепции вопроса, я удивлен, что не видел предложения, которое включает документацию. Документация имеет, есть и, вероятно, всегда будет вашим самым большим сообщением пользователям вашего кода.

/** 
* WARNING! DO NOT USE THIS UNLESS YOU ARE GOD! 
* This will probably break stuff unless... 
* .... 
*/ 
public void doEvilHackishThings() 
{ 
    // Stuff happens here. 
} 

Если вы правильно документируете свой код, разработчики знают, когда они могут сломать материал. Убедитесь, что вы не применяете код вуду и т. Д. Хорошая документация описывает в деталях, что она делает и как она это делает. Ни один разработчик в здравом уме не коснется примерного метода, не понимая, почему это зло.

0

Вы можете скрыть геттеры и сеттеры с помощью интерфейса, поддерживаемого этим конкретным классом. Это также будет стимулировать Tell, не спрашивайте, потому что нет никаких геттеров, которые вы могли бы использовать на интерфейсе. Использование конструктора также может быть скрыто на фабриках.

+1

Интерфейс для почти каждого объекта? –

+0

Это не так уж и необычно. EMF тоже это делает. – SpaceTrucker

Смежные вопросы