在java中将可变变量转换为不可变,痛苦更少

时间:2016-04-28 18:40:31

标签: java multithreading thread-safety immutability mutable

有时候我没有选择使用mutable变量而不是immutable个变量我知道有多少种方法可以创建不可变的变量但是我想知道这种方式也正确它真正将mutable转换为{ {1}}我不会在我的代码中使用immutableconcurrency只是好奇吗?

multithreading

这是嵌套类,我像

一样使用它
public class Config implements FindIt {
....
    private final class DateHolder{

    private final Date dateContainDateObject;

    DateHolder(String date) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
        dateContainDateObject = dateFormat.parse(date);
    }

    public Date getDate(){
        return dateContainDateObject;
    }

   }
}

并填充private DateHolder holder; 构造函数类中的holder变量,因此Config变量为holder

2 个答案:

答案 0 :(得分:2)

日期是一个可变对象。使其成为最终意味着你不能改变对它的引用,但你仍然可以改变引用的内容(java.util.Date/Calendar nastiness再次出现,如果可以的话,切换到Java 8 / Joda Time方式)。 / p>

不要将对Date成员的任何引用暴露给外界。而是制作防御性副本并将其传回。您可以考虑将时间值保存为最终的长实例成员,并仅在需要时实例化Date。

答案 1 :(得分:1)

当你创建私有和非静态类时,

可以说是安全的,当你创建表单Config类时,你只有一个DateHolder。

http://www.javapractices.com/topic/TopicAction.do?Id=29

why is static inner class singleton thread safe

http://www.javatpoint.com/how-to-create-immutable-class