【问题标题】:Creating an Object with a Class as Datatype in Java在 Java 中创建具有类作为数据类型的对象
【发布时间】:2021-04-15 02:35:53
【问题描述】:
Class Person{ 
     String name;
     int phone;
     Date meeting;

     public Person(String name, int phone, Date meeting){
          this.name = name;
          this.phone = phone;
          this.meeting = meeting;
}

Person 类使用 Date 类作为数据类型

Class Date{
int day;
int month;
int year;

public Date(int day, int month, int year){
     this.day = day;
     this.month = month;
     this.year = year;
}

我想创建一个具有名称、电话和会议日期的对象(一个人),例如:

Class TestPerson{

#Example 1#

Date Johnsmeeting = new Date(1,1,2021);
Person John = new Person("John",12345678, Johnsmeeting);

#Example 2#
Person John = new Person("John",12345678, new Date(1,1,2021));

我需要为日期创建一个额外的对象吗? 有没有更好的编码方式?

【问题讨论】:

  • 为什么创建日期对象不好?
  • 唯一不好的是有一个Date类,改用LocalDate
  • 这样创建对象并没有错,比没有new关键字更清楚,只有Joakim说的:不要使用旧时api,使用java.time.LocalDate

标签: java object types


【解决方案1】:

您的代码在实例化要传递给Person 的构造函数的Date 对象时是正确的。

您的示例 1 和 2 都是正确且有效的。有一个区别是,在示例#1中,您保留对Date类的引用,如果该类是可变的,那么进一步向下改变该对象的任何代码都将改变Date引用的Date对象。 @ 目的。 Person 中的代码可能会惊讶地发现日期的值无缘无故地发生了变化。有几种方法可以解决这个问题,包括:(a) 使您的 Date 类完全不可变,(b) 传递对象的副本/克隆,或 (c) 使用您的示例 #2 语法来避免无意中弄乱在别处使用的对象。

您的代码也在实例化另一个对象。文字 "John" 是用于实例化 String 对象的特殊语法。

我不确定这个过程会给您带来什么困扰。也许您可以编辑您的问题以解释您理解中的摩擦点。


顺便说一下,您的代码还有其他问题。

不要发明自己的Date 类。 Java 在 java.time 类中提供了其行业领先的日期时间框架。为您的目的使用LocalDate 对象。 java.time 类使用工厂方法而不是 new 构造函数。

LocalDate ld = LocalDate.of( 2021 , 1 , 23 ) ;

…或者使用枚举对象来表示月份。

LocalDate ld = LocalDate.of( 2021 , Month.JANUARY , 23 ) ;

遵循 Java 约定以使您的代码更易于阅读。类名以首字母大写开头,变量名没有。两者都使用驼峰式。所以Johnsmeeting 应该是johnMeeting

int 等数字类型通常不用于电话号码。电话号码在现实世界中是很复杂的,可能涉及到各个部分,也可能涉及到文字。此外,数字用于表示数量或位置(序数或索引)。电话号码都不是。

Java 16 将带来新的records 功能。这是一种新的缩写方式来定义一个主要是关于不可变携带数据的类。编译器隐式写入构造函数、getter、equals & hashCodetoString。您的Person 可能适合写为记录。

这是您的整个Person 课程记录。

public record Person( String name , String phone , LocalDate meeting ) 
{
}

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2020-06-09
    • 2018-04-08
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多