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

如何在Java中将静态类作为参数传递,java,design-patterns,Java,Design Patterns,我有一个名为“Entity”的基类,它有一个名为“construct”的静态方法,该方法返回一个实体实例。这个类有几个不同的子类(为了演示,假设我们有“水果”和“蔬菜”作为子类)。 我希望能够做到以下几点: Entity a = someFunction(Fruit, textfile) 然后,someFunction将textfile传递给Fruit.construct并返回生成的实体。 有一种简单的方法可以做到这一点吗?将Fruit.class传递给函数,然后使用该类对象上的反射来调用适当

我有一个名为“Entity”的基类,它有一个名为“construct”的静态方法,该方法返回一个实体实例。这个类有几个不同的子类(为了演示,假设我们有“水果”和“蔬菜”作为子类)。 我希望能够做到以下几点:

Entity a = someFunction(Fruit, textfile)
然后,someFunction将textfile传递给Fruit.construct并返回生成的实体。
有一种简单的方法可以做到这一点吗?

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

改用构造函数。

将文本文件传递给factory方法,该方法将使用该文本文件返回
实体的正确具体实例

静态方法本身不会被继承,因为如果您的代码具有Entity.Construction(…),它将不会将其动态链接到子类


实现您所要求的功能的最佳方法是使用反射来调用Fruit类(或传递到someFunction()方法中的任何类)上的构造方法。

Fruit
在您的示例中是一个类型,而
Fruit.eat()
可能指的是一个静态方法,
Fruit
不是一个“静态类”


有一个“类对象”,它实际上是表示类的
对象
。将其传递。要获得它,它们使用语法
果。类

您的意思是这样的:

public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
 return clazz.newInstance();
}
public T someFunction(Class clazz,String textFile)抛出Throwable{
返回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;
}
public T someFunction(Class clazz,String textFile)抛出Throwable{
//这里我假设clazz类有一个以字符串为参数的构造函数。
构造函数=clazz.getConstructor(新类[]{String.Class});
T obj=constructor.newInstance(文本文件);
返回obj;
}

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


相反,创建一个名为
EntityConstructor
的接口,该接口定义方法
construct()
。使
水果
蔬菜
实现该接口。然后更改
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;
    }
public T someMethod(类entityClass,文件文件)抛出实例化异常、非法访问异常{
T newEntity=entityClass.newInstance();
//用文件做些什么
// ...
返回新实体;
}
你应该注意

  • 自省:()
  • 仿制药:

但他描述的已经是工厂模式。你的意思是他可以不通过class对象就离开吗?你怎么知道这是可能的?@MarkoTopolnik:我不这么认为。我认为他有一个基类知道如何读取文本文件,他想在子类中重用它。他应该将其重构为工厂模式这是正确的答案,但你认为你可以用一个例子来澄清一下吗?@Tim:关于这种模式,有成千上万的演示文稿可供选择。如果你认为应该解决某个具体问题,我可以更新我的答案。这就是为什么我认为举个例子会有所帮助。就我个人而言,在这种情况下,我认为他应该是pas在工厂中唱歌,由
someFunction
调用,但正如您所说,有很多可能性。