【问题标题】:How do I create a default constructor including a Date as type Date?如何创建包含 Date 作为 Date 类型的默认构造函数?
【发布时间】:2021-04-27 21:06:13
【问题描述】:

在我的 Java College Class 中,我必须创建类 Customer。客户必须有名字、姓氏、生日和地址。

我的问题是填充默认构造函数,因为我必须为birthday 赋值。但我不知道该怎么做。如果我尝试写birthday = (1999,1,1),它会抛出一个错误并询问我是否要将生日转换为int

我的代码:

import java.util.Date;

public class Customer {
    private String firstName, lastName;
    private Date birthday;
    private String address;

    public Customer() {
        firstName = "Hans";
        lastName = "Meier";
        //birthday = ? 
        address = "-";
    }

    public Customer(String firstName, String lastName, Date birthday, String address) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthday = birthday;
        this.address = address;
    }

    public Customer(Customer customer) {
        firstName = customer.firstName;
        lastName = customer.lastName;
        birthday = customer.birthday;
        address = customer.address;
    }
}

【问题讨论】:

  • 这样的类通常没有默认构造函数。为什么你认为你需要一个?如果必须提供默认构造函数,我只会将类字段留空。
  • If i try to write birthday = (1999,1,1) 调用构造函数时,必须调用new 和类名。 = new Date( 1999, 1, 1)
  • 包括创建一些默认值?我再次认为将它们留空更好,它表明对象没有完全构造。
  • 是的,您可能不应该像这样使用 Date。因为这只是一个课堂作业,我认为这并不重要。它已被弃用,但它仍然有效。有关LocaleDate 的正确现代用法,请参阅下面的答案。但您可能想问您的讲师您应该使用哪种 API。
  • 如果生日未知,则应设置为null值,表示没有可用的日期。使用虚拟日期会产生误导。

标签: java java-time java.util.date


【解决方案1】:

java.util 的日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,转用modern date-time API

如果不必处理时区,可以使用LocalDate

private LocalDate birthday;

然后,你可以使用

birthday = LocalDate.of(1999, 1, 1);

如果要放时区信息,可以使用ZonedDateTime 例如

ZoneId zoneId = ZoneId.of("Europe/London");
ZonedDateTime birthday = ZonedDateTime.of(LocalDateTime.of(1999, 1, 1, 22, 10), zoneId);

通过 Trail: Date Time 了解有关现代日期时间 API 的更多信息。

仅供参考:java.util.Date 的大多数方法(包括构造函数)都是deprecated。如果要创建具有给定年月日的Date 对象,则应使用Calendar,如下所示:

Calendar calendar = Calendar.getInstance();
calendar.set(1999, 0, 1);
Date birthday = calendar.getTime();

注意java.util date-time API 中的月份是基于0January,你必须使用0,对于February,你必须使用1等等.

【讨论】:

  • 为什么要将时区信息放在出生日期中?
  • @Andreas - 这取决于...应用程序(星座应用程序)可能需要使用时区记录出生日期。
  • 除非您还询问出生时间,否则这毫无意义。
  • @Andreas - 好点......事实上,当我在一天开始时用 one-at-some- 替换 ZonedDateTime 时,您对时间的评论几乎同时出现给定时间。
  • 嗯,至少我出生在一个明确的时区。如果没有时区,您甚至无法从该人出生的时间点确定出生日期。同意,对于大多数客户注册目的,我们不需要它(而且通常我们也不需要日期;在这个作业中我们需要)。
【解决方案2】:

默认构造函数,我认为您的意思是为参数之一设置默认值。这可以通过重载构造函数来完成。同一个类可以有多个构造函数。像这样的:

public class Customer {
    private String firstName, lastName;
    private Date birthday;
    private String address;

    public Customer() {
        firstName="Hans";
        lastName = "Meier";
        birthday = new Date(915195600000l);
        address = "-";
    }

    public Customer(String firstName, String lastName, String address) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthday = new Date(915195600000l);
        this.address = address;
    }

    public Customer (String firstName, String lastName, Date birthday, String address) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthday = birthday;
        this.address = address;
    }

    public Customer (Customer customer) {
        firstName = customer.firstName;
        lastName = customer.lastName;
        birthday = customer.birthday;
        address = customer.address;
    }
}

请记住,日期以纪元时间作为参数。例如,您还可以使用其他构造函数(yyyy、MM、dd)之一。如果你想从字符串转换,请告诉我。

【讨论】:

  • 是的,我想知道
  • 是的,new Date(915195600000l) 非常明显地显示了分配的日期。为什么你希望出生日期是早上 8 点?哦,哎呀,你在另一个时区。 --- YYYY, mm, dd 绝对是日期格式模式的错误大小写。
  • 是的,你是对的,大小写错误。更正了它。关于使用纪元时间,这是我的一个习惯,因为使用数据库通常我将日期存储为时间戳。
猜你喜欢
  • 2011-06-01
  • 2021-06-10
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多