2015-12-25 3 views
4

Я занимаюсь java, создавая простой каталог. У меня 4 класса. К ним относятся:есть ли способ доступа к объекту внутри объекта?

  1. Person

  2. Адрес

  3. Контакт

  4. TestClass

Я уже закончили создание этой системы, и она работает так, как я хочу Это. Я сделал это, сделав 3 разных массива для Лица, адреса и контакта. Чтобы связать личность, адрес и контакт вместе, я помещаю их в соответствующий массив с тем же номером индекса. (Не в буквальном смысле их связывание, просто способ узнать, какой адрес или контакт для доступа при редактировании человека).

Но сейчас я хочу его оптимизировать. Я хочу создать единый HashMap, чтобы удерживать человека с адресом и контактами внутри него. Дополнительную информацию см. В моем коде ниже.

Person.class

public class Person { 
private long Id; 
private firtName; 
private Address address; 
private Contact contact; 

//some setter and getter methods 

public Person(Address address, Contact contact) { 
this.address = address; 
this.contact = contact; 
} 
} 

Address.class

public class Address { 

private String street; 
private String city; 
private String province; 


//some setter and getter methods 
} 

Contact.class

public class Contact { 

private long Phone; 
private String Email; 

//some setter and getter methods 
} 

testClass.class

public class testClass { 

public static void main(String[] args) { 
HashMap<Integer, Person> person = new HashMap<Integer, Person>(); 

person.put(1, new Person(new Address(), new Contact))); 
person.get(1).setStreet("place"); 

} 

} 

Мой вопрос, в этой строке кода в TestClass

person.get(1).setStreet("place"); 

есть способ прямого доступа к/редактировать адрес или связаться с человека без создания отдельного массива или метод?

+0

Я не понимаю, Что здесь проблема. Что такое «прямой доступ», о каком массиве/методе вы говорите? – ferit

+0

У вас есть методы getter для адресов и контактов и их изменение. –

+0

Маленькое дополнение на вашем именовании. Контакт может ошибочно приниматься за человека, в то время как вы скорее указываете контактную информацию. И вызов коллекции людей в единственном числе тоже сбивает с толку. Было бы легче читать как проиндексированные Люди или люди или, по крайней мере, люди. –

ответ

4
private Address address; 
private Contact contact; 

Если вы должны были сделать это public вместо private вы могли бы получить доступ к ним непосредственно, как так:

Person person = new Person(new Address(), new Contact()); 

Person p = person.get(1); 
String city = p.address.getCity(); 
String email = p.contact.getEmail(); 

Однако это нарушает принцип инкапсуляции (вы должны скрывать свои внутренние поля и разрешить доступ только с помощью методов).

Вместо этого вы должны создать свои человек класс следующим образом:

public class Person { 
    private long Id; 
    private firtName; 
    private Address address; 
    private Contact contact; 

//some setter and getter methods 

    public Person(Address address, Contact contact) { 
     this.address = address; 
     this.contact = contact; 
    } 

    public Address getAddress() { 
     return address; 
    } 

    public Contact getContact() { 
     return contact; 
    } 
} 

и доступ через

Person p = person.get(1); 
String city = p.getAddress().getCity(); 
String email = p.getContact().getEmail(); 
+0

путем создания метода getAddress() и getContact() означает, что я создаю экземпляр этих двух классов правильно? Но что, если я должен был сделать 100 человек, мне еще нужно сделать 100 ссылок для каждого getAddress и getContact? Я не знаю, будет ли это хороший дизайн. – bryn

+1

Вы создаете экземпляр этих классов только при использовании «нового» ключевого слова. После этого ваш класс Person сохраняет ссылку на их местоположение в памяти, а getAddress просто возвращает тот же объект. –

+0

Небольшое дополнение к этому: Вам необязательно передавать адрес и контактные данные в конструкторе. Вы также можете создавать сеттеры для них. Но это сильно зависит от вашей бизнес-логики. –

1

Когда человек представляет собой совокупность адресов, контактные информации и так далее, вы должны иметь добытчик и сеттеры для них.Вы бы затем написать это, чтобы установить улицу на человека:

person.getAddress().setStreet("this and that") 

и вы можете также назначить новый адрес какого:

person.setAddress(new Address("streeetname", "cityname")) 

Это общий идиома в Java и путь. Наличие объектов общего доступа создает новые проблемы, поскольку этот вид доступа не может быть изменен без побочных эффектов во всех классах, использующих их.

+0

моей проблемой с этим подходом является количество ссылок, которые мне нужно сделать для каждого getAddress человека. Я не могу придумать решение о том, как я могу сделать объект автоматически, используя префикс, чтобы сделать тезисы различными. – bryn

+0

Извините, я не совсем понимаю проблему здесь –

+0

Теперь я вас. Это о том, что я использую человека вместо person.get (x), правильно? В моем примере объект person - это один экземпляр Person. См. Мой комментарий по вопросу об условных обозначениях. –

1

То, что я вижу здесь, является проблемой инверсии зависимостей. Ваш класс Person зависит от Address и Contact. В чистом смысле адрес и контакт должны быть интерфейсами, поэтому их реализация может быть заменена во время выполнения.

public class Person { 
    private long Id; 
    private firstName; 
    private Address address; 
    private Contact contact; 

    public Person(Address address, Contact contact) { 
    this.address = address; 
    this.contact = contact; 
    } 

    public Address getAddress() { 
    return this.address; 
    } 

    public setAddress(Address address) { 
    this.address = address; 
    } 

    public Contact getContact() { 
    return this.contact; 
    } 

    public setContact(Contact contact) { 
    this.contact = contact; 
    } 

} 

Тогда вы могли бы получить доступ Address следующим образом:

person.get(1).getAddress().setStreet("place");