在java中,将可变变量转换为不可变变量不那么麻烦

在java中,将可变变量转换为不可变变量不那么麻烦,java,multithreading,thread-safety,immutability,mutable,Java,Multithreading,Thread Safety,Immutability,Mutable,有时我没有选择使用mutable变量而不是immutable变量,我知道有多少种方法可以创建不可变变量,但我想知道这种方法是否也可以将mutable转换为immutable,我的代码中不使用并发或多线程好奇 public class Config implements FindIt { .... private final class DateHolder{ private final Date dateContainDateObject; DateHolder(St

有时我没有选择使用
mutable
变量而不是
immutable
变量,我知道有多少种方法可以创建不可变变量,但我想知道这种方法是否也可以将
mutable
转换为
immutable
,我的代码中不使用
并发
多线程
好奇

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;

并在
Config
构造函数类中填充
holder
变量,以便
holder
变量是
ThreadSafe

日期是一个可变对象。将其设为final意味着您不能更改对它的引用,但仍然可以更改引用处的内容(java.util.Date/Calendar nastines再次出现,如果可以,请切换到java 8/Joda时间方式)


不要向外界公开对Date成员的任何引用。相反,制作一个防守副本并将其传回。您可以考虑将时间值保存为最终的长实例成员,并且只在需要时实例化日期。 当您将类设置为私有和非静态时,可以说是安全的;当您创建表单配置类时,您只有一个日期持有者


或者——说实话,一个更好的选择——不要使用
java.util.Date
…而使用
java.time
包中新的和改进的API,其中所有内容都是不可变的和线程安全的。@DimitarDimitrov告诉你,但我不想针对我喜欢的最后一个JDK支持更多JDK版本。请使用像Joda time这样的第三方库。我真的宁愿失去一根手指也不愿使用
java.util.Date