Java组合构造器
今天我遇到了作文。据我所知,对于合成的每个实例,我需要在构造函数中创建新对象,如下所示:Java组合构造器,java,constructor,instance,composition,Java,Constructor,Instance,Composition,今天我遇到了作文。据我所知,对于合成的每个实例,我需要在构造函数中创建新对象,如下所示: public class Human { private String name; private Adress adress; public Human (String name, Adress adress) { this.name = name; this.adress = new Adress(adress); } } 因此,如果我要创建一个类hu
public class Human {
private String name;
private Adress adress;
public Human (String name, Adress adress) {
this.name = name;
this.adress = new Adress(adress);
}
}
因此,如果我要创建一个类human的新实例,我需要为它分配一些address实例,或者创建一个全新的address,构造函数如下所示
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);
}
}
首先,这些代码正确吗?还有一个选择,如果我创建类human的新实例,atribute地址将是空的,我可以稍后使用set方法设置它吗?
非常感谢您的回答。新对象通常不是强制性的,但是,如果您想让人类的地址不可变(仅当地址已经不可变时),最好从对象外部删除对它的所有引用 这确实是作文的规则。 如果ADRES将ADRES作为其构造函数中的输入,那么这自然就是实现此目的的方法
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;
}
}
如果我正确理解您的问题,那么您正在寻找一个
默认构造函数
和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"));
请注意,我已经修复了
地址
中的打字错误,它们都是正确的
我更喜欢第一个,因为你的类地址也包含在人类类中
public class Human {
private String name;
private Adress adress;
public Human (String name, Adress adress) {
this.name = name;
this.adress = new Adress(adress);
}
}
首先,这些代码正确吗
你说正确是什么意思?它为你编译吗?如果是这样的话,那么他们是(不是真的,但至少在这个意义上)
如果我创建类human的新实例,属性Address
将为空,并且我可以稍后使用set方法设置它,这有什么选择吗
是的,您可以通过多种方式实现这一点,其中之一是通过添加适当的构造函数:
public Human (String name) {
this.name = name;
}
并添加一个设置器:
private void setAddress(Adress adress) {
this.adress = adress;
}
您可以创建一个新的Human
对象,其Address
参数设置为null
:
Human human = new Human("My Name", null, null);
但是,如果两个(或其中一个)参数都是null
,则必须检查这些参数并将address
设置为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;
}
}
<> >代码>地址>代码>通常有:街道1、街道2、城市、州、县、邮政编码、邮政编码扩展、国家、LAT/Lon等。我认为你的例子不足。
构建对象时,对象应该100%准备就绪。您可以重载构造函数或提供一个构建器来方便这一点
此规则的一个例外是Jackson的JSON序列化。对于所有序列化的私有数据成员,它都需要一个无参数构造函数和getter/setter对,因为它使用反射和JavaBean约定
没有对错,没有对错。在提高可读性、清晰性、易用性和易更改性的同时,还有一些适合您的代码的东西,并保持干燥
还有一点建议:名字很重要。好好想一想<代码>人类
?真正地除非你想要非人类的选择,否则我认为个人
或个人
或客户
或适合你的环境的东西将是更好的选择
这里还有另一个问题:人能否拥有多个地址
<代码>住宅
,邮寄
,运输
,车库
,等等。?您将如何处理此问题?仅当地址不可变时。否则就没有必要抄袭了。我要抗议的是,你的下半部分答案是直接抄袭自我的…@我一点也没有。我以我的名誉起誓。@YassinHajaj非常感谢您的回复。它为我清除了它,但是你能告诉我,如果一个新的对象不是强制性的,会不会只有这个?这不是聚合而不是合成吗?我认为聚合有一个引用,组合需要在构造函数中创建一个新实例。@D.Walker你说得对。合成意味着,如果对象被删除,合成也会被删除,因此我们需要它自己的对象引用。“它为您编译吗?如果是,那么它们就是。”-真棒。这一理论对我来说几乎从来都不起作用……试图强调短语“那些代码是正确的”不仅在语法上是错误的,而且在总体上是毫无意义的。