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

时间:2012-08-21 21:25:38

标签: java design-patterns

我有一个名为“Entity”的基类,它有一个名为“construct”的静态方法,它返回一个Entity实例。我有这个类的几个不同的子类(为了演示假设我们有“Fruit”和“Vegetable”作为子类)。 我希望能够按照以下方针做点什么:

Entity a = someFunction(Fruit, textfile)

someFunction然后将文本文件传递给Fruit.construct并返回生成的实体。 有一种简单的方法可以做到这一点吗?

7 个答案:

答案 0 :(得分:10)

改为使用factory pattern 将文本文件传递给工厂方法,该方法将使用它返回Entity

的正确具体实例

答案 1 :(得分:6)

你的意思是这样的:

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;
}

答案 2 :(得分:3)

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

答案 3 :(得分:2)

您的示例中的

Fruit是一个类型,虽然Fruit.eat()可能引用静态方法,但Fruit不是“静态类”。

有一个“类对象”实际上是代表类的Object。通过它而不是。为了实现它,他们使用了语法Fruit.class

答案 4 :(得分:1)

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

而是创建一个名为EntityConstructor的接口,该接口定义方法construct()。让FruitVegetable实现该接口。然后更改someFunction()以获取该接口的实例。

答案 5 :(得分:1)

这是一个实现:

public <T extends Entity> T someMethod(Class<T> entityClass, File file) throws InstantiationException, IllegalAccessException {
        T newEntity = entityClass.newInstance();
        // do something with file
        // ...
        return newEntity;
    }

你应该看看

答案 6 :(得分:0)

静态方法本身不是继承的,因为如果你的代码有Entity.construct(...),它就不会动态地将它链接到子类。

实现所要求的最好方法是使用反射来调用Fruit类上的构造方法(或者将任何类传递给someFunction()方法。