You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:55