有没有办法访问对象内的对象?

时间:2015-12-25 03:57:16

标签: java hashmap composition

我通过构建一个简单的目录来练习java。我有4个课程。这些是:

  1. 地址

  2. 联系

  3. 识别TestClass

  4. 我已经完成了这个系统的创建,它按照我想要的方式工作。我通过为Person,Address和Contact制作3个不同的数组来做到这一点。要将Person,Address和Contact链接在一起,我将它们放在具有相同索引号的相应数组上。 (不是将它们链接在一起,只是在编辑人员时知道要访问哪个地址或联系人的方式)。

    但是现在,我想优化它。我想创建一个HashMap来保存一个人,其中包含地址和联系人。有关详细信息,请参阅下面的代码。

    Person.class

    U

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

    Contact.class

    public class Address {
    
    private String street;
    private String city;
    private String province;
    
    
    //some setter and getter methods
    }
    

    testClass.class

    public class Contact {
    
    private long Phone;
    private String Email;
    
    //some setter and getter methods
    }
    

    我的问题是,在testClass中的这行代码

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

    有没有办法直接访问/编辑此人的地址或联系人而无需创建单独的数组或方法?

3 个答案:

答案 0 :(得分:6)

xr

如果你要制作这些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;
    }
}

答案 1 :(得分:1)

当一个人是地址,联系信息等的聚合时,你应该有那些的getter和setter。然后你写这个来设置一个人的街道:

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

您还可以分配一个新地址:

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

这是Java中常见的习惯用法和方法。拥有公共访问对象会产生新问题,因为在没有使用副作用的所有类中,这种访问都无法更改。

答案 2 :(得分:1)

我在这里看到的是依赖倒置问题。您的班级Person取决于AddressContact。在最纯粹的意义上,Address和Contact应该是Interfaces,因此它们的实现可以在运行时交换出来。

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