2011-11-02 76 views

回答

3

用户可以:

public interface Foo { 
    String a = Properties.getProperty("foo"); // public static final by default 
} 

然而,这意味着Properties.getProperty(..)必须是其依赖已初始化的消息源上的一个静态方法(静态再次)。取决于您使用的项目和框架,这可能不是最佳选择。

2

您可以通过包含final成员的配置初始化bean。既然它是最终的,你可以在构建/初始化时分配给它,然后它是不可变的。

要使用Spring配置属性文件,请检查PropertyPlaceholderConfigurer。这将允许您使用您的类路径,文件系统,远程服务等一个或多个属性文件的Spring bean

1

是的,这是可能的,初始化:

public static final CONSTANT = System.getProperty("myProperty"); 
+0

这不会从属性文件中获取属性。 – BalusC

-1

通过读取属性文件,就像在下面的例子中。

int property1; 
String otherProperty; 
public void loadProperties(File propFile) throws IOException { 
    BufferedReader reader = new BufferedReader(new FileReader(propFile)); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     if (line.startsWith("Property1=")) { 
      property1 = Integer.parseInt(line.substring(10)); 
     } 
     if (line.startsWith("OtherProperty=")) { 
      otherProperty = line.substring(14); 
     } 
    } 
} 
+1

您无法将该代码放入界面。 –

0

虽然使用一些静态辅助方法(如已经建议)是可能的,我会强烈建议你不要2倍这样做的原因:

  1. 这看起来像一个非常糟糕的设计。如果您需要动态值 - 使其成为界面中的一种方法。或者直接使用一个静态助手 - 无论如何你都需要一个静态助手来使它工作。
  2. 常量可能是在编译时内联。这种情况不应该发生在这种特殊情况下 - 编译器只有在能够证明在执行过程中值不会发生变化的情况下,才应该使用内联,基本上,如果您使用文字初始化它,但这样做的可能性很小。只要想一想它会有多糟糕 - 无论程序在哪个环境下运行,它都会在编译期间收集一些无用的值,而不是配置的值。 (这是一个理论问题,需要说)。
+0

好的,我的第二点是不相关的 - 按照Java语言规范9.3.1:“接口体中的每个字段都必须有一个初始化表达式,它不一定是一个常量表达式。当接口初始化时(第12.4节),赋值只执行一次。“ 所以这是一种有效的方法......但仍然非常难看。 –