我有一个名为“Entity”的基类,其中有一个名为“construct”的静态方法,它返回一个Entity实例。我有几个不同的这个类的子类(为了演示假设我们有"Fruit"和"Vegetable"作为子类)。
我想能够按以下方式进行操作:
Entity a = someFunction(Fruit, textfile)
someFunction会把textfile传递给Fruit.construct并返回生成的Entity。是否有简单的方法可以做到这一点?
我有一个名为“Entity”的基类,其中有一个名为“construct”的静态方法,它返回一个Entity实例。我有几个不同的这个类的子类(为了演示假设我们有"Fruit"和"Vegetable"作为子类)。
我想能够按以下方式进行操作:
Entity a = someFunction(Fruit, textfile)
someFunction会把textfile传递给Fruit.construct并返回生成的Entity。是否有简单的方法可以做到这一点?
public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
return clazz.newInstance();
}
上面的代码将使用类的无参构造函数(假设有这样一个构造函数)。
如果您的类需要使用特定的构造函数实例化,您可以按照以下示例操作:
public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
// Here I am assuming the the clazz Class has a constructor that takes a String as argument.
Constructor<T> constructor = clazz.getConstructor(new Class[]{String.class});
T obj = constructor.newInstance(textFile);
return obj;
}
将Fruit.class
传递给函数,然后在该类对象上使用反射调用正确的构造函数。请注意,这将通过要求存在构造函数而将超类与其子类紧密耦合。
你例子中的Fruit
是一种类型,虽然Fruit.eat()
可能指的是一个静态方法,但Fruit
并不是一个"静态类"。
实际上有一个名为"class Object" 的类,它实际上是代表该类的一个Object
对象。传递它作为参数即可。要获取它,可以使用语法Fruit.class
。
这是一个实现:
public <T extends Entity> T someMethod(Class<T> entityClass, File file) throws InstantiationException, IllegalAccessException {
T newEntity = entityClass.newInstance();
// do something with file
// ...
return newEntity;
}
你应该关注以下两个方面:
您正在尝试使用过程式代码实现面向对象设计模式策略。请不要这样做。
相反,创建一个名为EntityConstructor
的接口,该接口定义了construct()
方法。让Fruit
和Vegetable
实现该接口。然后更改someFunction()
以接受该接口的实例。
静态方法本身并不会被继承,如果您的代码有Entity.construct(...),它不会动态地将其链接到子类。
实现您所要求的最佳方法是使用反射在Fruit类(或传递到someFunction()方法的任何其他类)上调用construct方法。
someFunction
来调用,但正如你所说,有很多可能性。 - Tim