是否可以将对象传递给新的对象构造函数而不在内部使用它


是否可以

将对象类型或任何类型的类型传递到新对象的构造函数中,然后在构造函数中不使用它?

目的是根据新对象所在的

父类(聚合(创建新对象,以便它根据这一事实为自己生成不同的变量。

或者有更好的方法可以做到这一点吗?

public class ObjectA {
    private MalleableObject obj;
    public void createObject(){
        obj = new MalleableObject(this);
    }
}
public class ObjectB {
    private MalleableObject obj;
    public void createObject(){
        obj = new MalleableObject(this);
    }
}
public class MalleableObject{
    private boolean doIBelongToA;
    public MalleableObject(ObjectB obj){
        doIBelongToA = false;
    }
    public MalleableObject(ObjectA obj){
        doIBelongToA = true;
    }
}

您采取的方法肯定会奏效,但问题是这是否是一个好主意, 答案取决于您尝试解决的用例。

您询问了在构造函数中将对象作为参数而不使用它的问题

如果您不使用传递参数的属性,那么为什么要在参数中使用它,为此我们有空的构造函数,即使您没有指定默认情况下也会注入

 public MalleableObject(ObjectB obj){
    doIBelongToA = false; // if you are directly setting the value without 
    //using obj b then use default constructor.
 }
public MalleableObject(ObjectA obj){
    doIBelongToA = true;
}
/*If you are interested in setting the value based on the reference only there 
  is no problem with your approach as well, One alternative you can take to 
  combine both of them in single constructor and check the reference and set 
  the value accordingly*/

如果您使用对象的属性来创建新对象,那么这当然是一个好主意,

复制构造函数(如果您使用与参数相同的对象(,如果您正在使用已创建的类似对象创建对象,则复制原型设计模式

您给出的示例是一个非常基本的示例,它没有突出显示任何用例,因此不会建议您采用的方法

更简单的方法只是在 MalleableObject 的构造函数中添加布尔变量。

public class ObjectA {
  private MalleableObject obj;
  public void createObject(){
    obj = new MalleableObject(true);
  }
}
public class ObjectB {
  private MalleableObject obj;
  public void createObject(){
    obj = new MalleableObject(false);
  }
}
public class MalleableObject{
  private boolean doIBelongToA;
  public MalleableObject(boolean doIBelongToA){
    this.doIBelongToA = doIBelongToA;
  }
}

这将很容易确保从类 A 制成的对象对于 doIBelongToA 具有 true 的值。此外,如果添加,则不必为其他类添加不同的构造函数,以确保可扩展性

虽然您没有直接使用它,但您肯定正在使用参数中的信息。就个人而言,我会保存引用,或者至少保存其类型,以备以后使用,以防您需要它并实现doIBelongToA作为一种方法,但您的方法在技术上没有任何问题:

public class MalleableObject{
    private Class ownerType;
    public MalleableObject(Class ownerType) {
        this.ownerType = ownerType;
    }
    public boolean doBelongToA() {
        return ownerType.equals(ObjectA.class);
    }
}

上述方法有效,但不是最佳实践,因此有一些局限性。我建议您使用构建器模式,您可以在其中创建使用构建器来创建对象,然后使用定义行为的方法。您将能够扩展它以在将来添加变量/业务逻辑。

我觉得工厂模式也不错 要看的东西

最新更新