【问题标题】:Inheritance in Java and how are members inheritedJava中的继承以及成员如何继承
【发布时间】:2020-06-05 06:51:38
【问题描述】:

我正在研究构建器设计模式并遇到了一个错误。为什么来自 PersonBuilder 类的 Person 成员在 DetailsBuilder 和 JobBuilder 类中不同?它们不应该是同一个对象并且 org 和 name 函数更新同一个对象吗?

当我运行代码时,我得到以下输出:

Person{name='name', org='null'}
Person{name='name', org='null'}
Person{name='null', org='org'}
Person{name='null', org='org'}

代码:

class Person
{
    public String name;
    public String org;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", org='" + org + '\'' +
                '}';
    }
}

class PersonBuilder {
    Person person = new Person();

    public DetailsBuilder details() {
        System.out.println(person);
        return new DetailsBuilder();
    }
    public JobBuilder job() {
        System.out.println(person);
        return new JobBuilder();
    }
    public Person build(){
        return person;
    }
}

class DetailsBuilder extends PersonBuilder{

    public PersonBuilder name(String name) {
        this.person.name = name;
        System.out.println(person);
        return this;
    }
}

class JobBuilder extends PersonBuilder{


    public PersonBuilder org(String org) {
        this.person.org = org;
        System.out.println(person);
        return this;
    }
}

public class Main {

    public static void main(String[] args) {
        PersonBuilder personBuilder = new PersonBuilder();
        Person p = personBuilder.details().name("name").job().org("org").build();
        System.out.println(p);

    }
}

【问题讨论】:

  • 我有点不确定,有什么问题。你能提供源代码,它不像你期望的那样工作吗? PS:对于简单的构建器,您可以使用项目 lombok。见projectlombok.org/features/Builder

标签: java inheritance design-patterns


【解决方案1】:

这是因为每次创建构建器时,您都在创建它自己的 Person 实例。因此,每次创建这些构建器时,您都会获得不同的 Person 实例。如果需要相同的实例,则必须传递 Person 对象的先前引用。

【讨论】:

  • 是的,现在说得通了。非常感谢。
【解决方案2】:

在 PersonBuilder 中创建新的 JobBuilder 或 DetailsBuilder 时,您也在创建 Person 对象的新实例


public class TestJavaCode {

    public static void main(String[] args) {
        PersonBuilder personBuilder = new PersonBuilder();
        System.out.println("personBuilder.person: " + personBuilder.person.hashCode());
        DetailsBuilder details = personBuilder.details();
        System.out.println("details.person: " + details.person.hashCode());
        PersonBuilder name = details.name("name");
        System.out.println("name.person: " + name.person.hashCode());
        JobBuilder job = name.job();
        System.out.println("job.person: " + job.person.hashCode());
        PersonBuilder org = job.org("org");
        System.out.println("org.person: " + org.person.hashCode());
        Person p = org.build();
        System.out.println("p: " + p.hashCode());
        System.out.println(p);

    }
}

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 2018-05-11
    • 2020-01-17
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2019-03-23
    • 2023-03-14
    相关资源
    最近更新 更多