【问题标题】:How to initialize constant such as "public static final Integer" in java from args[] in main method (or any)如何从main方法(或任何方法)中的args []初始化java中的“public static final Integer”等常量
【发布时间】:2014-02-01 00:31:08
【问题描述】:

我基本上是Java的初学者,我正在尝试解决这个问题:

我的项目通过许多类使用(整数)常量,我需要从程序的文件/参数设置这个常量,我不知道如何。我可以删除“最终”声明,但这违反了所有惯例。

如何解决这个问题?避免它的最佳方法是什么?请帮帮我:)

简短的例子:

public class App {
    public static final int k;  
    public static void main( String[] args ) {
        k = Integer.parseInt(args[0]); // does not work ... sure but how? 
    }
}

编辑:public STATIC void main ...(它缺少静态)

【问题讨论】:

    标签: java initialization arguments constants


    【解决方案1】:

    您只能在 static { } 块中使用此类功能。

    我建议将常量本身设为私有,并且只能通过 public static getter 方法访问。这应该是一个合适的架构。

    【讨论】:

    • 我想这对我很有效,但它不是违反常量吗?
    • 是的,但是我相信这对于通过命令行指定的值来说已经足够保护了。
    【解决方案2】:

    您需要使用static{} 块:

    public class App {
        public static final int k;
    
        static {
            String kvalue = "";
            try
            {
                // Insert some code to open a file and read a value from it.
                kvalue = "<value from file>";
            }
            catch( Exception e )
            {
                // handle any exceptions opening the file
            }
            finally
            {
                k = Integer.parseInt( kvalue );
            }
        }
    
        public static void main( final String[] args ) {
            // do stuff
        }
    }
    

    【讨论】:

    • 这对于文件来说非常好,但是程序参数呢?可以修改一下吗?
    【解决方案3】:

    或者,您可以让每个需要此值的类访问共享数据池 ApplicationContext,其中值 X 将作为常量驻留:

    public final class ApplicationContext {
    
        public static abstract class Worker {
    
            private final ApplicationContext mApplicationContext;
    
            public Worker(final ApplicationContext pApplicationContext) {
                this.mApplicationContext = pApplicationContext;
            }
    
    
            public final ApplicationContext getApplicationContext() {
                return this.mApplicationContext;
            }
    
        }
    
        private final int mX;
    
        ApplicationContext(final String[] pArgs) {
            this.mX = pArgs[0];
        }
    
    
        public final int getX() {
            return this.mX();
        }
    
    }
    

    通过让所有相关类扩展ApplicationContext.Worker,我们可以确保访问常量值,而不必依赖static 实现,因为所有类在构造时都会收到对ApplicationContext 的引用。

    【讨论】:

      【解决方案4】:

      它不起作用,因为static final 变量只能在静态块中初始化。

      【讨论】:

      • 您能从文件中读取并在static 块中初始化变量吗?
      • 当然。您可以创建一个方法来读取和初始化静态字段,该字段将在静态块中调用。或者您可以将代码直接放在静态块中的try-catch 块中。
      • 对不起,我忘了在 main 方法前添加静态语句。我说的是“public static void main” ofc
      • 好的静态块你的意思是这样的: static { k = Integer.parseInt(new SomeReader("InputFile.txt).readLine()); } ?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 2016-05-22
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多