【发布时间】:2021-05-04 12:33:29
【问题描述】:
如何创建不可变的 Planet 以保持名称不变?我正在苦苦挣扎,因为我认为它是具有可变对象的不可变项目。如果我错了,请纠正我。
每次我在输出中更改名称时也会更改。我错过了什么吗?
我尝试将所有字段设置为私有和最终字段(不在此示例中),但我认为我缺少一些工作代码。
我知道 java.util.Date 已被弃用,但这只是示例。
import java.util.Date;
public final class Planet {
String name;
private final Date discoveryDate;
public Planet (String name, Date discoveryDate) {
this.name = name;
this.discoveryDate = new Date(discoveryDate.getTime());
}
public String getName()
return name;
}
public Date getDiscoveryDate() {
return new Date(discoveryDate.getTime());
}
public static void main(String [] args) {
Planet Earth = new Planet("Earth Planet", new Date(2020,01,16,17,28));
System.out.println("Earth");
System.out.println("------------------------------------");
System.out.println("Earth.getName: " + Earth.getName());
System.out.println("Earth.getDiscoveryDate: " + Earth.getDiscoveryDate());
}
}
【问题讨论】:
-
java.util的日期时间 API 及其格式 APISimpleDateFormat已过时且容易出错。建议完全停止使用它们并切换到modern date-time API。此外,自 JDK 1.1(24 年前发布)以来,Date(int year, int month, int date, int hrs, int min) 已被弃用。 -
您没有将
name标记为final,这是为什么呢?Planet应该是不可变的。 -
Date类不仅设计不佳而且早已过时,正如您所说,它也是可变的!因此,对于不可变类中的字段,这是一个有问题的选择(有办法绕过它,但由于 java.time 的日期时间类已经是不可变的,简单的解决方案是切换到其中之一)。
标签: java oop immutability access-modifiers