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

is there a way to access an object within an object?

我正在通过构建一个简单的目录来练习 java。我有 4 类。它们是:

  1. 地址

  2. 联系

  3. 测试类

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

但是现在,我想优化一下。我想创建一个 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");

有没有办法在不创建单独的数组或方法的情况下直接access/edit此人的地址或联系方式?

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

但是这违反了封装原则(你应该隐藏你的内部字段并且只允许通过方法访问)。

相反,您应该按如下方式创建您的人 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;
    }

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

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

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

你也可以指定一个新地址:

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

这是Java中的常用成语和要走的路。拥有 public 访问对象会产生新的问题,因为在所有 类 使用它们的情况下,无法在没有副作用的情况下更改这种访问。

我在这里看到的是依赖倒置问题。您的 class Person 取决于 AddressContact。从最纯粹的意义上讲,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");