修改由构建器类创建的对象的属性

时间:2017-05-30 16:15:01

标签: java builder

有一个已经存在的类,一个带有嵌套静态构建器类的pojo。项目中有两个组件。

组件A使用构建器构建后发送ObjectX。组件B接收它并在组件B的整个生命周期中使用其属性进行计算。

我的问题是需要在组件B中更改ObjectX的属性。

在使用构建器方法之前无法完成,因为构建在组件A中发生。由于对构建器设计模式创建的对象具有setter方法不是实践,因此解决此问题的方法是什么。 对象x的FYI模型位于组件B内。由于组件A将具有通过Jars在部署中可用的组件B代码,因此可以更改ObjectX模型以完成它。我只是想知道如果这是正确的方法。

class ComponentA{


   CallingMethodofComponenentB( new objectXBuilder().setName("B).setAge(5).build());

}
class ComponenetB {

receivingObjectXMethod(ObjectX x){

   println(x.getName() + x.getAge());
}

Class ObjectX{

    private ObjectX(ObjectXBuilder builder){
        this.name = builder.getName();
        this.age = builder.getAge();
    }

// Getters ...

public static class ObjectXBuilder{

    private String name;
    private int age

    // Setters ...


    ObjectXBuilder(String name, int age){
        this.name = name;
        this.age = age;
    }

    ObjectX build(){
        return new ObjectX(this);
    }
}

要求是根据组件B侧的逻辑来改变年龄。这应该在构建器类中完成,还是应该有ObjectX的setter?

3 个答案:

答案 0 :(得分:0)

您可以引入一个特定于B的课程,将其称为ObjectXForB,您可以使用该课程在ObjectX字段中撰写。
通过这种方式,您可以在ObjectXForB中定义计算的年龄值。

例如,您可以用这种方式创建对象:

ObjectXForB objectXForB = new ObjectXForB(objectX);

使用ObjectXForB类:

public class ObjectXForB{
   private ObjectX objectX;
   private int age;

   public ObjectXForB(ObjectX objectX){
      this.objectX = objectX;
       // logic to get a new value of age if required
       ... 
       age = ...;
   }


   public int getAge(){
       return age;
   }

   // raw view methods on the ObjectX component
    public String getName(){
       return objectX.getName();
   }
}

如果可以在类之间引入通用接口 ObjectX和ObjectXForB,它可能会更好,因为您可以使用ObjectX类型而不是ObjectXForB声明变量。如果适用,它允许更改实现。

答案 1 :(得分:0)

copyOf(ObjectX)添加方法ObjectXBuilder,以便能够使用现有对象初始化构建器。

ObjectX other = new ObjectXBuilder().copyOf(objectX).setAge(42).build();

答案 2 :(得分:0)

我认为你可能会混合使用不可变量和构建器的概念。

如果要更改不可变的属性,可以使用一些原始的不可变属性创建一个包装创建新的不可变的类。

{{1}}