Java 基于外部参数值初始化的常量字段成员

Java 基于外部参数值初始化的常量字段成员,java,static,constants,classloader,Java,Static,Constants,Classloader,我想在类中声明一个常量, 这样,当类被加载时,它将被设置为第一件事,并且不会改变 但是,应将其设置为的值取决于类从文件读取的文件的内容。 以下操作不起作用: static final int N=someMethod(path); 除非我还有: static Path path = Paths.get("C:\\Users\\Me\\S2.txt"); 如果我这样做,每次运行时都必须手动更改path.get()的参数 在调用Java时给出路径名也不行——这完全是错误的 main()方法(?

我想在类中声明一个常量, 这样,当类被加载时,它将被设置为第一件事,并且不会改变

但是,应将其设置为的值取决于类从文件读取的文件的内容。 以下操作不起作用:

static final int N=someMethod(path); 
除非我还有:

static Path path = Paths.get("C:\\Users\\Me\\S2.txt");
如果我这样做,每次运行时都必须手动更改
path.get()
的参数

在调用Java时给出路径名也不行——这完全是错误的
main()
方法(?)的
String[]
参数和
main()
直到稍后才会运行

有没有比我在上面两行代码中所做的更好的方法


TIA

在我看来,声明常量值并将其值设置为引用另一个值是没有意义的。我想说,在您的情况下,最好使用系统属性。这个问题的答案非常清楚地解释了如何做到这一点:

就像卢卡斯说的,这样做:

static Path path = Paths.get(System.getProperty("path"));
java myCoolCode.jar -Dpath=C:\\Users\\Me\\S2.txt
然后在运行代码时,按如下方式运行:

static Path path = Paths.get(System.getProperty("path"));
java myCoolCode.jar -Dpath=C:\\Users\\Me\\S2.txt

静态成员是在加载类时设置的。你也许可以用一个自定义的
类加载器玩游戏,但这里面有疯狂。也许如果你解释一下为什么需要这个,我们可以建议一个更好的选择。为什么它必须是最终的?您可以在值可用时设置它,并确保它是不可变的。@JimGarrison可以不使用var N final,但作为常量看起来更好。该类将加载一个大小为N的问题实例——读取文件并初始化静态区域中的所有数据strcs。然后将在非静态实例中探索解决方案空间。不希望N——一旦在所有这些参数中设置了size参数,就会触动它。@user3880721:在静态初始值设定项中读取文件是个坏主意。举个例子。该实例可以是一个单实例,但要使其成为一个实例,以便获取该实例的代码能够处理由于尝试读取文件而导致的异常以及可能出现错误的任何情况。@T.J.Crowder我将有多个实例。单身汉不合适。这就是为什么我要保持静止。同意你的第一句话。如果多个实例依赖于同一个值,你可能会从依赖注入中受益。您应该尽量限制使用
静态成员的数量,特别是当您需要动态行为时。