java - 在 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));
我需要为日期创建一个额外的对象吗?有没有更好的编码方法?
解决方案
您的代码在实例化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
&hashCode
和toString
. 您Person
可能适合写为记录。
这是你的Person
全班记录。
public record Person( String name , String phone , LocalDate meeting )
{
}
推荐阅读
- php - 在 php 中将另一个类的类型声明为另一个类的属性还有哪些其他选择
- java - 使用 HQL 从 Oracle 11 DB 获取数据以在网页上显示
- javascript - Javascript按随机百分比执行函数
- word-wrap - 在网页中包装日文字符
- node.js - 如何使用设置间隔来做更多的事情而不是输出一行?节点.js
- reactjs - 反应井字游戏,Array.slice(),可变性
- javascript - 根据选中的复选框启用和禁用两个不同的按钮 - JQuery
- c# - MobgoDB 自定义成员序列化器
- r - 是否可以从节点绘制箭头到什么都没有?
- php - Click2Mail REST API 获取调用没有 XML 结果