发布
社区首页 >问答首页 >Java OOP原理

Java OOP原理
EN

Code Review用户
提问于 2020-05-08 17:53:59
回答 4查看 1.2K关注 0票数 4

我们在Java中有家庭作业来做一些用户、契约和一些API。我们应该创建一个用户,提供关于他的一些信息,其中一个信息应该是地址(一个是他住的地方,一个是帖子应该来的地方),但我不确定我是否做对了。

我创建了一个名为user的包,在其中我创建了User.class

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
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);

    }
}

我只想问一下,这样做是否是好做法,还是应该有所不同。我们不能使用嵌套类和静态方法。谢谢你的评论。

EN

回答 4

Code Review用户

回答已采纳

发布于 2020-05-08 19:52:20

欢迎来到代码评审,并感谢您分享您的代码。

OfficialAddress扩展了类User。这看上去不对。

通过扩展类,您可以声明一个是关系。但地址从来都不是用户。

相反,用户有一个地址。在OOP中,这是通过赋予所有者(类User)另一个类(OfficialAddress)的属性来表示的:

代码语言:javascript
代码运行次数:0
复制
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;
    }
} 
票数 18
EN

Code Review用户

发布于 2020-05-09 11:21:55

在设计类时,千万不要忽略您正在构造和使用代码的内容。

代码语言:javascript
代码运行次数:0
复制
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。这意味着它可以在线程之间共享,而不必担心在部分更新时使用它。

将类分解为较小的类,可以避免冗长的不可读构造函数参数列表。

票数 5
EN

Code Review用户

发布于 2020-05-09 17:22:51

在用户中,可以将用户名定义为:

代码语言:javascript
代码运行次数:0
复制
private String firstName;
private String lastName;

这是非常普遍的,也是非常错误的。我是那些用首字母、中间名和姓的怪胎之一。这在美国并不少见,在我的例子中,这是一种家庭传统--我们成年后就开始使用我们的中间名字,所以当他们坚持使用我们的名字时,有人在叫我孩子。不,我不会把我的中间名字放在一个要求名字的插槽里。

即使在美国,它也会变得更奇怪。我们有“艺术家以前被称为王子”(如果你不记得的话) --他把名字改成了一个无法辨认的符号。

然后是“月亮单位Zappa”(月亮单位是她的名字)。

还有来自美国以外的国家和文化的名字。

而且,只是为了使它更肮脏,名字并不是唯一的!即使只有一个“名字”字段,我也怀疑在美国有几个独一无二的名字(我当然希望Zappa女士就是其中之一)。

请查看以下链接:错误的程序员相信名字

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/241956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档