2016-03-13 3 views
0

Сегодня я наткнулся на композицию. Из того, что я понимаю, для каждого экземпляра композиции нужно создать новый объект в конструкторе, например:Состав Java - Конструктор

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); 
    } 
} 

Прежде всего, это те коды правильно? А также есть ли какой-либо вариант, что если бы я создал новый экземпляр класса human, атрибут Adress был бы пустым, и я мог бы установить его позже, используя метод set? Большое спасибо за ваш ответ.

ответ

0

Новый объект не является обязательным в целом, однако, если вы хотите иметь адрес человека неизменяемым (только если Адрес уже не является неизменным), это хорошая практика, чтобы убить все ссылки на него извне объект.

Это действительно правило для композиции.

Это, естественно, способ сделать это, если адрес принимает адрес в качестве своего конструктора.

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

@ AndyTurner Спасибо Энди, исправил его. –

+0

Я должен протестовать против того, что ваша вторая половина ответа * скопирована * прямо из моего ... – Idos

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.

0

Оба они правильные.

Hovever Я предпочитаю первую, потому что вы работаете именно с вашим классом Address, который также включен в класс Human.

public class Human { 
    private String name; 
    private Adress adress; 

    public Human (String name, Adress adress) { 
     this.name = name; 
    this.adress = new Adress(adress); 
    } 
} 
0

Прежде всего, это те коды правильно?

Что вы подразумеваете под правильным? Он компилируется для вас? Если это так, то это (не совсем, но в этом смысле как минимум).

есть ли вариант, что, если я хотел бы создать новый экземпляр класса человека, атрибут Address будет пустым, и я мог установить его позже, используя набор метод?

Да, вы можете добиться этого во многих отношениях, один из них путем добавления соответствующего конструктора:

public Human (String name) {  
    this.name = name; 
} 

И добавив setter:

private void setAddress(Adress adress) {  
    this.adress = adress;  
} 
+0

"_Des компилируется для вас? Если да, то они are__" - удивительно. Эта теория почти никогда не работает для меня ... –

+1

Пытаясь подчеркнуть, что фраза * эти коды правильные *, не только грамматически некорректна, но и бессмысленна вообще. – Idos

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; 
} 

И вы можете создать метод установки, который позволяет изменение адреса, только если адрес null сам, или адресные параметры являются null. То есть, если это то, что вы хотите.
Вот пример ниже:

public void setAddress(Address address) { 
    if (this.address == null) { 
     this.address = address; 
    } 
} 
0

Address обычно имеет гораздо больше, чем это: улица 1, улица 2, город, район, почтовый индекс, почтовый расширение код, страна, широта/долгота, и т.д. Я будет считать ваш пример неадекватным.

Объект должен быть на 100% готов к работе, когда он будет построен. Вы можете перегружать конструкторы или предоставлять строителю такое удобство.

Единственным исключением из этого правила является сериализация JSON с Джексоном. Он требует конструкторов no-arg и пар getter/setter для всех последовательных рядовых членов данных, поскольку он использует соглашения отражения и Java Bean.

Нет правильного или неправильного, правильного или неправильного. Там работает то, что работает для вашего кода, в то же время повышая читаемость, ясность, простоту использования и изменения и поддерживая DRY.

Еще один совет: имена имеют большое значение. Подумайте, долго и упорно о них. Human? Действительно? Если вы не собираетесь использовать альтернативы, отличные от человека, я бы сказал, что лучший выбор будет Person или Individual или Customer или что-то для вашего контекста.

Адрес: Person Адрес: Person Адрес: Address Адрес: Residence, Mailing, Shipping, Garaging, и т.п.? Как вы справитесь с этим?

Смежные вопросы