有一个已经存在的类,一个带有嵌套静态构建器类的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?
答案 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}}