Java组合 - 构造函数

时间:2016-03-13 13:58:43

标签: 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);
   }
}

因此,如果我要创建一个类人类的新实例,我需要为它分配一些地址实例,或者创建一个全新的地址,构造函数看起来像这样

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方法设置它? 非常感谢您的回复。

6 个答案:

答案 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 constructorgetter-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?除非您打算使用非人类替代方案,否则我会说PersonIndividualCustomer或某些内容适合您的情况。

以下是另一个问题:Person可以有多个Address吗? ResidenceMailingShippingGaraging等?你将如何处理这个?