我通过构建一个简单的目录来练习java。我有4个课程。这些是:
人
地址
联系
识别TestClass
我已经完成了这个系统的创建,它按照我想要的方式工作。我通过为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");
}
}
有没有办法直接访问/编辑此人的地址或联系人而无需创建单独的数组或方法?
答案 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
取决于Address
和Contact
。在最纯粹的意义上,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");