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 time.sourceforge.net/apidocs/org/joda/time/DateTime.html" rel="nofollow">DateTime обект, който е неизменен.

person Bozho    schedule 07.11.2010
comment
Значи ли това, че не мога да използвам променливи на java.lang, защото повечето от тях са променливи? Знам, че: Boolean, Byte, Character, Double, Float, Integer, Long, Short, String са неизменни. Понякога имам нужда от Muttable обекти, особено когато картографирам много към много отношения в Hibernate. - person danny.lesnik; 07.11.2010
comment
И защо е лоша практика да се създават екземпляри всеки път, когато се получи обект? - person danny.lesnik; 07.11.2010
comment
добре, не винаги е лоша идея, но трябва добре да дефинирате набора от възможни състояния. Не е проблем да създавате екземпляр всеки път (освен ако вашият метод не се извиква милиони пъти). Но както казах, предоставянето на променлив сетер проваля целта - някой ще използва променливия сетер и ще има проблеми. - person Bozho; 07.11.2010
comment
@Bozho 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