0

我有一个接口,我在其中定义了跨应用程序使用的常量。我有一个场景,我需要根据条件初始化常量。

例如,类似的东西,

if(condition){
public static final test = "some value";
}

这可能吗。

4

5 回答 5

1

Interface不包含代码。

将您的接口拆分为许多特定接口,声明和初始化它们自己的常量。

这将遵循Interface Segregation Principle一个类不必对一些无用的常量或方法感到厌烦的地方。

当然,Java 让类一次实现多个接口。因此,如果您有特定的接口来混合一个具体的类,这将非常容易。

于 2012-09-27T12:29:33.260 回答
1

接口将被实现。它们不应该用作常数的载体。如果您需要这样的东西,您可以考虑使用私有构造函数的最终类。

您似乎想要的是一个全局变量或单例,这是相当有问题的设计,或者类似 ac 预处理器指令,在编译时动态评估。

因此,请考虑它是否真的是您需要的常量 - 在编译(或类加载)时定义的东西。

于 2012-09-29T17:24:58.877 回答
0

这可能是接口常量不好的另一个原因。您可以简单地使用enums如下所示。

public enum Const {
    SAMPLE_1(10), SAMPLE_2(10, 20);

    private int value1, value2;
    private Const(int value1, int value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    private Const(int value1) {
        this.value1 = value1;
    }

    //Value based on condition
    public int getValue(boolean condition) {
        return condition == true ? value2 : value1;
    }

    //value which is not based on conditions
    public int getValue() {
        return value1;
    }
}
于 2012-09-27T13:00:18.760 回答
0

您可以通过以下方式设置带有条件的静态最终变量:

public class Test {

    public static final String test;
    static {
      String tmp = null;
        if (condition) {
            tmp = "ss";
        }
        test = tmp;
    }

}

您可以在一行中完成,也可以在以下界面中完成:

public static final String test = condition ? "value" : "other value";
于 2012-09-27T12:29:45.030 回答
0
public interface InitializeInInterface {

    public static final String test = Initializer.init();

    static class Initializer {
        public static String init() {
            String result = "default value";
            InputStream is = InitializeInInterface.class.getClassLoader().getResourceAsStream("config.properties");
            Properties properties = new Properties();
            try {
                properties.load(is);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if ("bar".equals(properties.getProperty("foo"))) {
                result = "some value";
            }
            return result;
        }
    }
}
于 2012-09-27T12:30:09.937 回答