【问题标题】:Spring setters/ getters and Mutable VariablesSpring setter/getter 和可变变量
【发布时间】:2010-11-07 09:43:10
【问题描述】:

让我们建议我有以下课程

    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 使用可变的 getter 和 setter 并在我的自定义编码中使用不可变的 setter 和 getter 是一种好习惯。我最怕的是:

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

现在发生了什么,我刚刚更改了 myClass 对象中日期变量的值,它可能是系统错误的主要根源。

我说的对吗? 我也可以为 Spring/Hibernate 使用不可变的 getter 和 setter 吗?

【问题讨论】:

    标签: java hibernate spring spring-mvc mutable


    【解决方案1】:

    请注意,如果您提供可变的 setter 和 getter,它最终会被人们使用。所以这不是一个好的选择。

    这个问题与spring和hibernate并不是特别相关,而更多的是与API设计有关。 Josh Bloch 建议 - “最小化可变性”。但这意味着你应该使用不可变对象,而不是每次获取对象时都创建实例。

    上面的解决方案是使用joda-time的DateTime对象,它是不可变的。

    【讨论】:

    • 这是否意味着我不能使用 java.lang 变量,因为它们中的大多数都是可变的?我知道:Boolean、Byte、Character、Double、Float、Integer、Long、Short、String 是不可变的。有时我需要 Muttable 对象,尤其是当我在 Hibernate 中映射多对多关系时。
    • 为什么每次获得对象时都创建实例是不好的做法?
    • 嗯,这并不总是一个坏主意,但你必须很好地定义一组可能的状态。每次创建一个实例都不是问题(除非你的方法被称为百万次)。但正如我所说,提供一个可变的 setter 违背了目的 - 有人将使用可变的 setter 并且会遇到麻烦。
    • @Bozho 是 Hibernate 和/或 JPA 支持的 DateTime 吗?
    • @seanizer - 我只是将 type="java.util.Date" 映射为 Postgresql 中的时间戳。
    猜你喜欢
    • 2014-03-27
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2015-02-28
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多