可以将对象类型或简单地将任何类型的类型传递到新对象的构造函数中,然后在构造函数内部不使用它吗?
目的是根据新对象所在的父类(将其聚合)创建新对象,以便根据该事实为其自身生成不同的变量。
或者有更好的方法吗?
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;
}
}
答案 0 :(得分:2)
您采用的方法肯定会奏效,但问题是,这是否是一个好主意,答案取决于您尝试解决的用例。
您问过要在构造函数中将对象用作参数而不使用它
如果您不使用传递的参数的属性,那么为什么要在参数中使用它,因为我们有空的构造函数,即使您未指定默认情况下也会被注入
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*/
如果您使用对象的属性来创建新对象,那么肯定是个好主意,
如果您使用与参数相同的对象,则复制构造函数;如果使用已经创建的相似对象创建对象,则复制原型设计模式
您提供的示例是一个非常基本的示例,它没有突出显示任何用例,因此不会建议您采用的方法
答案 1 :(得分:1)
更简单的方法是在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。 此外,如果添加其他类,则不必添加其他构造函数,从而确保可扩展性
答案 2 :(得分:0)
虽然您没有直接使用它,但是绝对可以使用参数中的信息。就个人而言,我会保存引用或至少引用的类型,以备后用,以备您需要时使用doIBelongToA
作为方法,但是您的方法在技术上没有错:
public class MalleableObject{
private Class ownerType;
public MalleableObject(Class ownerType) {
this.ownerType = ownerType;
}
public boolean doBelongToA() {
return ownerType.equals(ObjectA.class);
}
}
答案 3 :(得分:0)
以上方法有效,但这不是最佳实践,因此存在一些局限性。我建议您使用构建器模式,在其中可以使用构建器来创建对象,然后使用一种定义行为的方法。您将来可以扩展它以添加变量/业务逻辑。
我认为Factory模式也不错 要看的东西