如何在Java中将静态类作为参数传递

12

我有一个名为“Entity”的基类,其中有一个名为“construct”的静态方法,它返回一个Entity实例。我有几个不同的这个类的子类(为了演示假设我们有"Fruit"和"Vegetable"作为子类)。

我想能够按以下方式进行操作:

Entity a = someFunction(Fruit, textfile)

someFunction会把textfile传递给Fruit.construct并返回生成的Entity。是否有简单的方法可以做到这一点?

7个回答

10

使用工厂模式代替。
将文本文件传递给工厂方法,该方法将使用它返回正确的Entity具体实例。


2
但是他所描述的已经是工厂模式了。你是说他可以不传递类对象吗?你怎么知道这是可能的? - Marko Topolnik
1
@MarkoTopolnik:我不这么认为。我认为他有一个基类,知道如何读取文本文件,并希望在子类中重用它。他应该将其重构为工厂模式。 - Cratylus
3
这是正确的答案,但您能否举个例子来更清晰地解释一下呢? - Tim
@Tim:实际上有成千上万个这种模式的演示文稿可用。如果你认为应该解决某些特定问题,我可以更新我的答案。 - Cratylus
这就是为什么我认为一个例子会有所帮助。就我个人而言,在这种情况下,我认为他应该将工厂传递给someFunction来调用,但正如你所说,有很多可能性。 - Tim

7
你是指像这样的内容吗:
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;
}

3

Fruit.class传递给函数,然后在该类对象上使用反射调用正确的构造函数。请注意,这将通过要求存在构造函数而将超类与其子类紧密耦合。


2

你例子中的Fruit是一种类型,虽然Fruit.eat()可能指的是一个静态方法,但Fruit并不是一个"静态类"。

实际上有一个名为"class Object" 的类,它实际上是代表该类的一个Object对象。传递它作为参数即可。要获取它,可以使用语法Fruit.class


1

1

您正在尝试使用过程式代码实现面向对象设计模式策略。请不要这样做。

相反,创建一个名为EntityConstructor的接口,该接口定义了construct()方法。让FruitVegetable实现该接口。然后更改someFunction()以接受该接口的实例。


0

静态方法本身并不会被继承,如果您的代码有Entity.construct(...),它不会动态地将其链接到子类。

实现您所要求的最佳方法是使用反射在Fruit类(或传递到someFunction()方法的任何其他类)上调用construct方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接