我有一个名为“Entity”的基类,它有一个名为“construct”的静态方法,它返回一个实体实例。我有这个类的几个不同的子类(为了演示假设我们有“水果”和“蔬菜”作为子类)。我希望能够按照以下方式做一些事情:
Entity a = someFunction(Fruit, textfile)
someFunction 然后将 textfile 传递给 Fruit.construct 并返回生成的实体。有没有一种简单的方法可以做到这一点?
我有一个名为“Entity”的基类,它有一个名为“construct”的静态方法,它返回一个实体实例。我有这个类的几个不同的子类(为了演示假设我们有“水果”和“蔬菜”作为子类)。我希望能够按照以下方式做一些事情:
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
但不是“静态类”。
有一个“类对象”,它实际上是一个Object
代表类的对象。而是通过它。为此,Fruit.class
使用了它们的语法。
您正在尝试使用过程代码实现面向对象的设计模式Strategy。不要这样做。
相反,创建一个名为 的接口EntityConstructor
,它定义了方法construct()
。制作Fruit
并Vegetable
实现该接口。然后更改someFunction()
以获取该接口的实例。
这是一个实现:
public <T extends Entity> T someMethod(Class<T> entityClass, File file) throws InstantiationException, IllegalAccessException {
T newEntity = entityClass.newInstance();
// do something with file
// ...
return newEntity;
}
你应该看看
静态方法本身不是继承的,因为如果您的代码具有 Entity.construct(...) 它不会动态地将其链接到子类。
完成您所要求的最佳方法是使用反射来调用 Fruit 类(或传递给 someFunction() 方法的任何类)上的构造方法。