Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java组合构造器_Java_Constructor_Instance_Composition - Fatal编程技术网

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你说得对。合成意味着,如果对象被删除,合成也会被删除,因此我们需要它自己的对象引用。“它为您编译吗?如果是,那么它们就是。”-真棒。这一理论对我来说几乎从来都不起作用……试图强调短语“那些代码是正确的”不仅在语法上是错误的,而且在总体上是毫无意义的。