Spring сеттеры/геттеры и изменяемые переменные

Давайте предположим, что у меня есть следующий класс

    Public MyClass{

    Date date;

    //Mutable getters and setters

    public Date getdate(){
    retrurn date;
    }

    public Date setdate(Date date)
    {date = date;}

    //Now immutable setter and Getters 

    public Date getImmutableDate{
    return new Date(date.getDate());
    }

    public void setImmutableDate(Date mydate)
    {
    date = new Date(mydate.getDate());
    }
 }

Хорошо ли использовать изменяемые геттеры и сеттеры для Spring или Hibernate Framework и использовать неизменяемые сеттеры и геттеры для моего пользовательского кодирования. Чего я боюсь, так это следующего:

MyClass myclass = new MyClass();
//assuming that item date was initalized some how.
Date currentDate = myClass.getdate();
currentDate.setMonth( currentDate.getMonth() + 1 );

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

Я прав? Могу ли я использовать неизменяемые геттеры и сеттеры для Spring/Hibernate?


person danny.lesnik    schedule 07.11.2010    source источник


Ответы (1)


Обратите внимание, что если вы предоставите изменяемый сеттер и геттер, они в конечном итоге будут использоваться людьми. Так что это не лучший вариант.

Вопрос не особо связан с spring и hibernate, а больше с дизайном API. Джош Блох советует — «свести к минимуму изменчивость». Но это означает, что вы должны использовать неизменяемые объекты, а не создавать экземпляры каждый раз при получении объекта.

Приведенное выше решение заключается в использовании joda-time DateTime, который является неизменяемым.

person Bozho    schedule 07.11.2010
comment
Значит ли это, что я не могу использовать переменные java.lang, потому что большинство из них изменяемы? Я знаю, что: Boolean, Byte, Character, Double, Float, Integer, Long, Short, String неизменны. Иногда мне нужны изменяемые объекты, особенно когда я сопоставляю отношения «многие ко многим» в Hibernate. - person danny.lesnik; 07.11.2010
comment
И почему создание экземпляров каждый раз при получении объекта является плохой практикой? - person danny.lesnik; 07.11.2010
comment
что ж, это не всегда плохая идея, но вы должны четко определить набор возможных состояний. Не проблема каждый раз создавать экземпляр (если только ваш метод не вызывается миллионы раз). Но, как я уже сказал, предоставление изменчивого установщика противоречит цели - кто-то будет использовать изменчивый установщик и попадет в беду. - person Bozho; 07.11.2010
comment
@Божо, DateTime поддерживается Hibernate и/или JPA? - person Sean Patrick Floyd; 07.11.2010
comment
@seanizer - я просто сопоставляю type=java.util.Date как временную метку в Postgresql. - person danny.lesnik; 07.11.2010
comment
Конечно, но я спрашивал о версии JodaTime. - person Sean Patrick Floyd; 07.11.2010
comment
@seanizer - да, есть пользовательский тип гибернации - person Bozho; 07.11.2010
comment
Вы также можете использовать java.time.LocalDateTime, начиная с Java 8. - person Akash; 05.05.2016