如何在Java新对象中使用Date类型?附代码示例
在Reiziger类中使用java.util.Date类型的指南
首先,我看到你的Reiziger类里的setGBdatum方法没写完,先把它补全,同时优化一下类的封装性:
import java.util.Date; public class Reiziger { private String naam; private Date gbdatum; public Reiziger(String nm, Date gbdtm) { this.naam = nm; // 创建Date副本,避免外部修改影响类内部状态 this.gbdatum = new Date(gbdtm.getTime()); } public String getNaam() { return naam; } public void setNaam(String naam) { this.naam = naam; } public Date getGBdatum() { // 返回副本,防止外部直接篡改内部的Date对象 return new Date(gbdatum.getTime()); } public void setGBdatum(Date gbdatum) { // 设置时同样传入副本,保证内部状态不受外部干扰 this.gbdatum = new Date(gbdatum.getTime()); } }
接下来,我会带你一步步创建Reiziger对象并正确使用其中的Date字段:
1. 创建Date对象的几种实用方式
方式一:使用过时但仍可用的Date构造器
这类构造器虽然被标记为过时,但旧项目中仍能使用,注意年份要减1900,月份从0开始计数(0代表1月,11代表12月):
// 创建1990年5月15日的Date对象 Date geboorteDatum = new Date(1990 - 1900, 5 - 1, 15); Reiziger reiziger1 = new Reiziger("Jan Jansen", geboorteDatum);
方式二:用Calendar类构建Date(替代过时构造器)
Calendar能更安全地构建日期,避免过时API的潜在问题,还能通过常量让月份更直观:
import java.util.Calendar; Calendar cal = Calendar.getInstance(); cal.set(1990, Calendar.MAY, 15); // 直接用Calendar.MAY代表5月,无需手动减1 Date geboorteDatum = cal.getTime(); Reiziger reiziger2 = new Reiziger("Piet Pietersen", geboorteDatum);
方式三:Java 8+ 用现代java.time API转换(推荐)
Java 8引入的java.time包解决了Date和Calendar的设计缺陷,你可以先创建更易用的LocalDate,再转换为Date:
import java.time.LocalDate; import java.time.ZoneId; LocalDate localDate = LocalDate.of(1990, 5, 15); // 转换为Date时需要指定时区 Date geboorteDatum = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); Reiziger reiziger3 = new Reiziger("Anna de Vries", geboorteDatum);
2. 关键注意事项:Date的可变性陷阱
java.util.Date是可变对象,如果直接返回或传入原引用,外部代码可以随意修改这个对象的内容,破坏Reiziger类的封装性。比如:
// 错误示例:外部直接修改内部Date Reiziger reiziger = new Reiziger("Jan", new Date()); Date date = reiziger.getGBdatum(); date.setTime(System.currentTimeMillis()); // 这会直接改变Reiziger内部的gbdatum值
而我们在构造器、getter和setter中创建Date副本的做法,就能避免这个问题——外部修改的只是副本,不会影响类内部的字段状态。
内容的提问来源于stack exchange,提问作者Plox333
相关产品推荐
相关产品推荐

