首页 > 解决方案 > 在 Java 中创建具有类作为数据类型的对象

问题描述

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));

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

标签: javaobjecttypes

解决方案


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

您的示例 1 和 2 都是正确且有效的。有一个区别是,在示例#1中,您保留对Date类的引用,如果该类是可变的,那么进一步向下改变该对象的任何代码都将改变该Date对象引用的完全相同的Person对象。中的代码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 将带来新的记录功能。这是一种新的缩写方式来定义一个主要是关于不可变携带数据的类。编译器隐式编写构造函数、getter、equals&hashCodetoString. 您Person可能适合写为记录。

这是你的Person全班记录。

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

推荐阅读