如何自实例化 Java 类?我不应该使用类文件以外的任何文件。还假设在我初始化 NAME 变量的行之后,他们在编译时不知道类的名称。
示例:
public class Foo implements Bar {
public static final String NAME = "Foo";
private void instantiate() {
Bar baz = (Bar)Class.forName(NAME).newInstance();
}
//...
}
将是错误的,因为它需要另一个名为Bar.java
的文件。应该是:
public class Foo {
/*
Instantiate self...
*/
}
我加入了这个编程挑战网站,每个问题只允许提交一个文件。我想为我将用于挑战的所有类创建一个模板类。所以,我的想法是我会这样做:
public class Foo {
public static final String NAME = "Foo";
public static void main (String[] args) throws IOException {
//Instantiate self and call launch(args)
Foo foo = new Foo();
foo.launch(args);
System.exit(0);
}
public void launch(String[] args) {
//...Do actual code here
}
}
我只想更改类名称和 NAME 变量,而不必更改每次使用模板类时实例化类的方式。根据我当前的设置,我必须编辑以下行: Foo foo = new Foo();
以及下面的行。
您可能还想知道为什么我必须调用 launch()
而不是在 main 方法中执行所有操作。这只是我从我的 Java 讲师那里得到的东西。这也是因为我无法在 main()
方法中使用非静态方法。
最佳答案
如果您“实现”任何东西,您需要定义一个接口(interface)。要么导入已经存在的一个,要么必须创建它。无论哪种方式,如果它是公共(public)类(抽象与否)或接口(interface),则它必须在单独的文件中定义。与 C++ 不同,这是 java 的要求。
如果:
public class Foo implements Bar {
}
那么您的项目必须至少包含:
Foo.java
Bar.java
期间。没有如果/和/但是。
但是,如果您的项目中绝对必须只有一个文件,则必须获得一个字节码生成器并在运行时动态构建您的类和接口(interface)。
真正的问题是:您想要实现什么目标?如果是单例/工厂,其他人已经回答了。如果是为了减少编译单元的数量,那么你就不走运了。 Java 强制要求您必须这样做。
作者更新后编辑:
Java 可以让你做这样的事情:
Foo.java:
public class Foo {
public static void main(String[] args) {
Bar bar = new Bar();
}
}
class Bar {
int bar_var;
Snafu fu = new Snafu();
public Bar() { }
public int getBarVar() { return bar_var; }
}
class Snafu {
int var;
public Snafu() { }
}
....
这将实现您想要实现的目标。
关于java - Java 中的自实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1674885/