我目前正在使用一个接受类型对象的构造函数 然后我根据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方法。主要问题在于对象的转换。我一直认为重复的代码是错误的代码。这会变得更优雅吗?
答案 0 :(得分:4)
更好,更类型安全的设计是创建多个重载的构造函数。那么你就不需要任何强制类型转换,你就不可能通过传递一个不合适类型的对象来构造一个对象。
public MyClass(CusClass1 myObject) {
globalVar1 = myObject.getAttrib1();
globalVar2 = myObject.getAttrib2();
}
public MyClass(CusClass2 myObject) {
globalVar1 = myObject.getAttrib1();
globalVar2 = myObject.getAttrib2();
}
CusClass1
和CusClass2
具有相同的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)
如果你有很多这样的自定义类,最好使用反射和/或注释(特别是如果不是所有这些都在编译时都知道,这可能是唯一的解决方案)。
如果所有自定义类都具有相同名称的必要属性/方法(例如示例中的attrib1
和attrib2
),则反射更容易。您只需要一组潜在的类名,以及要查询的属性的名称。
但是,如果属性名称可能不同,您可以考虑使用注释在每个类中标记所需的源属性。
答案 4 :(得分:0)
如果您可以修改CusClass1
和CusClass2
,则可以创建一个界面
public interface AttributeProvider {
Object getAttrib1(); // or whatever type getAttrib1 should return
Object getAttrib2();
}
然后确保CusClass1
和CusClass2
实现此接口:
public class CusClass1 implements AttributeProvider {
...
}
然后你可以拥有一个只有那个接口的构造函数:
public MyClass(AttributeProvider myObject) {
globalVar1 = myObject.getAttrib1();
globaVar2 = myObject.getAttrib2();
}
这样,如果您创建新的MyClass
,则不必修改CusClass3
,MyClass
也应该在{{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();
}
}