我有一个接受 MyObject 接口作为参数的方法。在这个方法中,我想创建一个相同运行时实现类的对象。像这样
public void myMethod(MyObject myObject) {
MyObject localObject = new ...??//instantiate a concrete MyObject like the parameter myObject.
doSomething(localObject);
}
public void doSomething(MyObject myObject){//do something with this object}
我在 MyObject 上没有任何类型的 clone() 实现,也没有原型设计。
也许我在做一些完全不是 Java 的事情?
答案 0 :(得分:2)
如果 MyObject
是一个(可能是抽象的)类/接口,你可以创建一个复制方法:
public interface MyObject{
MyObject newOfSameType();
}
public abstract class MyObject{
public abstract MyObject newOfSameType();
}
然后实现可以覆盖 copy()
方法:
public class MyConcreteObject implements MyObject{
@Override
public MyConcreteObject newOfSameType(){
MyConcreteObject copy=new MyConcreteObject();
//You could do setup stuff, here
}
}
}
另一种方法是使用反射来创建相同类型的对象:
MyObject localObject;//set it to something
Class<? extends MyObject> cl=localObject.getClass();
Constructor<? extends MyObject> constructor=cl.getConstructor();//expect no-args-constructor
//Constructor<? extends MyObject> constructor=cl.getConstructor(cl);//expect copy constructor
//Constructor<? extends MyObject> constructor=cl.getConstructor(Parameter.class);//expect a constructor with a parameter of a class called Parameter, varargs work, here
MyObject instance=constructor.newInstance();
//MyObject instance=constructor.newInstance(instance);//copy constructor
//MyObject instance=constructor.newInstance(yourParameter);//parameter of type Parameter, varargs work here
答案 1 :(得分:0)
您可以根据运行时的具体实现来创建对象。 如果您有 2 个具体的实现,MyObject1 和 MyObject2,请使用以下内容:
public static MyObject copyObject(MyObject myObject) {
if (myObject == null) return null;
if (myObject instanceof MyObject1) {
return new MyObject1();
}
if (myObject instanceof MyObject2) {
return new MyObject2();
}
return null;
}
反思。