今天我遇到了作文。根据我的理解,对于每个组合实例,我需要在构造函数中创建新对象,如下所示:
public class Human {
private String name;
private Adress adress;
public Human (String name, Adress adress) {
this.name = name;
this.adress = new Adress(adress);
}
}
因此,如果我要创建一个类人类的新实例,我需要为它分配一些地址实例,或者创建一个全新的地址,构造函数看起来像这样
public class Human {
private String name;
private Adress adress;
public Human (String name, String city, String country) {
this.name = name;
this.adress = new Adress(city, country);
}
}
首先,这些代码是否正确?还有什么选择,如果我要创建类人类的新实例,属性Adress将是空的,我可以稍后使用set方法设置它? 非常感谢您的回复。
答案 0 :(得分:0)
一般来说,新对象并不是强制性的,但是,如果你想拥有人类不可变的地址(只有当Adress已经不是不可变的时候),最好从对象外面删除对它的所有引用。
这确实是作文的规则。
如果adress在其构造函数中将地址作为输入,这自然就是这样做的。
public class Human {
private String name;
private Adress adress;
public Human (String name, Adress adress) {
this.name = name;
this.adress = new Adress(adress);
}
}
如果需要,您可以拥有一组不同的构造函数,稍后设置一些字段
public class Human {
private String name;
private Adress adress;
public Human() {}
public Human(String name){
this.name = name;
}
public Human(String name, Adress adress) {
this.name = name;
this.adress = adress; // or new Adress(adress)
}
public void setAdress (Adress adress) {
this.adress = adress;
}
}
答案 1 :(得分:0)
如果我理解你的问题是正确的,那么你正在为姓名和地址寻找default constructor
和getter-setters
。
以下是代码段:
public class Human {
private String name;
private Address address;
/* Default Constructor */
public Human() {}
public Human(String name, Address address) {
this.name = name;
this.address = new Address(address);
}
/* Getter for Name */
public String getName() {
return this.name;
}
/* Setter for Name */
public void setName(String name) {
return this.name = name;
}
/* Getter for Address */
public Address getAddress() {
return this.address;
}
/* Setter for Address */
public void setAddress(Address address) {
return this.address = address;
}
}
现在,您可以通过以下方式轻松创建类Human
的新对象:
Human h = new Human();
然后按如下方式设置名称或地址:
h.setName("foo");
h.setAddress(new Address("foo","bar"));
请注意我已修复了adress
中的拼写错误。
答案 2 :(得分:0)
两者都是正确的。
Hovever我更喜欢第一个,因为你完全使用Human类中包含的类Address。
public class Human {
private String name;
private Adress adress;
public Human (String name, Adress adress) {
this.name = name;
this.adress = new Adress(adress);
}
}
答案 3 :(得分:0)
首先,这些代码是否正确?
你的意思是什么?它能为你编译吗?如果是这样,那么他们(不是真的,但至少在这个意义上)。
有没有选项,如果我要创建类人类的新实例,属性
Address
将为空,我可以稍后使用set方法设置它?
是的,您可以通过多种方式实现这一目标,其中之一是添加适当的构造函数:
public Human (String name) {
this.name = name;
}
添加setter
:
private void setAddress(Adress adress) {
this.adress = adress;
}
答案 4 :(得分:0)
您可以创建一个新的Human
对象,其Address
参数设置为null
:
Human human = new Human("My Name", null, null);
但是,如果两个(或其中一个)都是address
,则必须检查这些参数并将null
设置为null
。
或者你可以在Human
类中定义一个新的构造函数:
public Human(String name) {
this.name = name;
/* The line below is not required, since objects are set to null by default*/
this.address = null;
}
您可以创建一个setter方法,只有在地址为null
本身或地址参数为null
时才允许地址更改。也就是说,如果这就是你想要的
以下是一个例子:
public void setAddress(Address address) {
if (this.address == null) {
this.address = address;
}
}
答案 5 :(得分:0)
Address
通常比这更多:街道1,街道2,城市,州,县,邮政编码,邮政编码扩展,国家,纬度/经度等。我会认为你的例子不合适。< / p>
物体在构造时应该100%准备就绪。您可以重载构造函数或提供构建器以使其方便。
此规则的一个例外是与Jackson的JSON序列化。它需要一个no-arg构造函数和所有序列化私有数据成员的getter / setter对,因为它使用了反射和Java Bean约定。
没有对错,正确或不正确。适用于您的代码的是什么,同时仍然提高可读性,清晰度,易用性和易用性以及维护DRY。
还有一点建议:名字很重要。仔细思考他们。 Human
? 真?除非您打算使用非人类替代方案,否则我会说Person
或Individual
或Customer
或某些内容适合您的情况。
以下是另一个问题:Person
可以有多个Address
吗? Residence
,Mailing
,Shipping
,Garaging
等?你将如何处理这个?