我们在Java中有家庭作业来做一些用户、契约和一些API。我们应该创建一个用户,提供关于他的一些信息,其中一个信息应该是地址(一个是他住的地方,一个是帖子应该来的地方),但我不确定我是否做对了。
我创建了一个名为user的包,在其中我创建了User.class
package xxx;
import java.util.List;
public abstract class User {
private int ID;
private String firstName;
private String lastName;
private int idNumber;
private String email;
private String officialAddress;
private String postAddress;
private List contracts;
public User(String firstName, String lastName, int idNumber, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.idNumber = idNumber;
this.email = email;
}
public String getFullName() {
return firstName + " " + lastName;
}
}
和OfficialAddress.class
package xxx;
public class OfficialAddress extends User {
private int zipcode;
private String region;
private String streetName;
private int streetNumber;
public OfficialAddress(String firstName, String lastName, int idNumber, String email) {
super(firstName, lastName, idNumber, email);
}
}
我只想问一下,这样做是否是好做法,还是应该有所不同。我们不能使用嵌套类和静态方法。谢谢你的评论。
发布于 2020-05-08 19:52:20
欢迎来到代码评审,并感谢您分享您的代码。
类OfficialAddress
扩展了类User
。这看上去不对。
通过扩展类,您可以声明一个是关系。但地址从来都不是用户。
相反,用户有一个地址。在OOP中,这是通过赋予所有者(类User
)另一个类(OfficialAddress
)的属性来表示的:
public class OfficialAddress { // no extending here
// ...
}
public class User{
private OfficialAddress officialAddress;
// ...
public User(String firstName, String lastName, int idNumber, String email, OfficialAddress, officialAddress) {
this.firstName = firstName;
this.lastName = lastName;
this.idNumber = idNumber;
this.email = email;
this.officialAddress = officialAddress;
}
}
发布于 2020-05-09 11:21:55
在设计类时,千万不要忽略您正在构造和使用代码的内容。
User user = new User(
123,
new FullName("Homer", "Jay", "Simpson"),
new Email("chunkylover53@aol.com"),
new Address("742", "Evergreen Terrace", "??", "?????"),
new Contacts(124, 125, 126, 127)
);
user.sendBill(overdueNotice);
user.sendEmail(promotion42);
它使用的是组合,而不是继承,而继承通常是首选的,没有其他原因。
这样做,类可以完全不可变,因为没有使用过setter。这意味着它可以在线程之间共享,而不必担心在部分更新时使用它。
将类分解为较小的类,可以避免冗长的不可读构造函数参数列表。
发布于 2020-05-09 17:22:51
在用户中,可以将用户名定义为:
private String firstName;
private String lastName;
这是非常普遍的,也是非常错误的。我是那些用首字母、中间名和姓的怪胎之一。这在美国并不少见,在我的例子中,这是一种家庭传统--我们成年后就开始使用我们的中间名字,所以当他们坚持使用我们的名字时,有人在叫我孩子。不,我不会把我的中间名字放在一个要求名字的插槽里。
即使在美国,它也会变得更奇怪。我们有“艺术家以前被称为王子”(如果你不记得的话) --他把名字改成了一个无法辨认的符号。
然后是“月亮单位Zappa”(月亮单位是她的名字)。
还有来自美国以外的国家和文化的名字。
而且,只是为了使它更肮脏,名字并不是唯一的!即使只有一个“名字”字段,我也怀疑在美国有几个独一无二的名字(我当然希望Zappa女士就是其中之一)。
请查看以下链接:错误的程序员相信名字
https://codereview.stackexchange.com/questions/241956
复制相似问题