Java中的继承以及成员是如何继承的
我在研究builder设计模式时遇到了一个bug。为什么PersonBuilder类的Person成员在DetailsBuilder和JobBuilder类中不同?它们不应该是同一个对象,并且组织和名称函数更新同一个对象吗 当我运行代码时,我得到以下输出:Java中的继承以及成员是如何继承的,java,inheritance,design-patterns,Java,Inheritance,Design Patterns,我在研究builder设计模式时遇到了一个bug。为什么PersonBuilder类的Person成员在DetailsBuilder和JobBuilder类中不同?它们不应该是同一个对象,并且组织和名称函数更新同一个对象吗 当我运行代码时,我得到以下输出: Person{name='name', org='null'} Person{name='name', org='null'} Person{name='null', org='org'} Person{name='null', org='o
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);
}
}
这是因为每次创建生成器时,您都在创建它的Person实例。因此,每次创建这些构建器时,都会得到不同的Person实例。如果您需要相同的实例,则必须传递Person对象的上一个引用。在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);
}
}
是的,现在说得通了。非常感谢。我有点不确定,问题是什么。你能提供源代码吗,它不能像你期望的那样工作?PS:对于简单的构建器,您可以使用ProjectLombok。看见