采用多种类型的方法

时间:2011-08-25 10:53:45

标签: java constructor variable-assignment

我目前正在使用一个接受类型对象的构造函数 然后我根据instanceof

测试它的类型
Public MyClass (Object obj)
{
if(obj instanceof CusClass1){
CusClass1 myObject = (CusClass1) obj;
globalVar1 = myObject.getAttrib1();
globaVar2 = myObject.getAttrib2();
}
if(obj instanceof CusClass2){
CusClass2 myObject = (CusClass2) obj;
globalVar1 = myObject.getAttrib1();
globaVar2 = myObject.getAttrib2();
}
}

这可以偏移到构造函数中调用的initalise方法。主要问题在于对象的转换。我一直认为重复的代码是错误的代码。这会变得更优雅吗?

6 个答案:

答案 0 :(得分:4)

更好,更类型安全的设计是创建多个重载的构造函数。那么你就不需要任何强制类型转换,你就不可能通过传递一个不合适类型的对象来构造一个对象。

public MyClass(CusClass1 myObject) {
    globalVar1 = myObject.getAttrib1();
    globalVar2 = myObject.getAttrib2();
}

public MyClass(CusClass2 myObject) {
    globalVar1 = myObject.getAttrib1();
    globalVar2 = myObject.getAttrib2();
}

CusClass1CusClass2具有相同的getAttrib1()getAttrib2()方法吗?然后考虑创建这两个类实现的接口,并创建一个构造函数,该构造函数接受实现该接口的对象:

public interface Attribs {
    String getAttrib1();
    int getAttrib2();
}

public class CusClass1 implements Attribs {
    // ...
}

public class CusClass2 implements Attribs {
    // ...
}

public class MyClass {
    // You can now pass anything that implements interface Attribs
    public MyClass(Attribs myObject) {
        globalVar1 = myObject.getAttrib1();
        globalVar2 = myObject.getAttrib2();
    }
}

答案 1 :(得分:0)

为每种类型的对象创建一个方法。

public MyClass(CusClass1 obj) {
    field1 = obj.getProperty1();
    field2 = obj.getProperty2();
}

public MyClass(CusClass2 obj) {
    field1 = obj.getOtherProperty1();
    field2 = obj.getOtherProperty2();
}

答案 2 :(得分:0)

不要重复代码而不要施放。创建2个构造函数:一个接受CusClass1,第二个接受CusClass2。单独实施它们。

答案 3 :(得分:0)

如果你有很多这样的自定义类,最好使用反射和/或注释(特别是如果不是所有这些都在编译时都知道,这可能是唯一的解决方案)。

如果所有自定义类都具有相同名称的必要属性/方法(例如示例中的attrib1attrib2),则反射更容易。您只需要一组潜在的类名,以及要查询的属性的名称。

但是,如果属性名称可能不同,您可以考虑使用注释在每个类中标记所需的源属性。

答案 4 :(得分:0)

如果您可以修改CusClass1CusClass2,则可以创建一个界面

 public interface AttributeProvider {
     Object getAttrib1();  // or whatever type getAttrib1 should return
     Object getAttrib2();
 }

然后确保CusClass1CusClass2实现此接口:

 public class CusClass1 implements AttributeProvider {
     ...
 }

然后你可以拥有一个只有那个接口的构造函数:

 public MyClass(AttributeProvider myObject) {
     globalVar1 = myObject.getAttrib1();
     globaVar2 = myObject.getAttrib2();
 }

这样,如果您创建新的MyClass,则不必修改CusClass3MyClass也应该在{{1}}中使用

答案 5 :(得分:0)

如果您的构造函数可以修改为接受CusClass1和CusClass2而不是Object,那么您可以遵循其他答案中提供的解决方案之一。

否则,是的,您可以像这样使用和init方法:

public class MyClass {

    public MyClass (Object obj) {
        if (obj instance of CusClass1) {
         init((CusClass1) obj);
        } else if (obj instanceof CucClass2) {
         init((CusClass2) obj);
        }

        // shared initialization code
    }

    public void init(CusClass1 obj) {
        globalVar1 = obj.getAttrib1();
        globaVar2 = obj.getAttrib2();
    }

    public void init(CusClass2 obj) {
        globalVar1 = obj.getAttrib1();
        globaVar2 = obj.getAttrib2();
    }
}