gpt4 book ai didi

java - Java 中的自实例化

转载 作者:行者123 更新时间:2023-11-30 01:39:03 24 4
gpt4 key购买 nike

如何自实例化 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com