アプリケーション全体で使用される定数を定義したインターフェイスがあります。条件に基づいて定数を初期化する必要があるシナリオがあります。
たとえば、次のようなもの、
if(condition){
public static final test = "some value";
}
これは可能ですか?
アプリケーション全体で使用される定数を定義したインターフェイスがあります。条件に基づいて定数を初期化する必要があるシナリオがあります。
たとえば、次のようなもの、
if(condition){
public static final test = "some value";
}
これは可能ですか?
インターフェイスが実装されます。定数のキャリアとして使用しないでください。そのようなものが必要な場合は、プライベートコンストラクターを使用した最終クラスを検討することをお勧めします。
必要と思われるのは、グローバル変数またはシングルトンです。これらはかなり問題のある設計であるか、コンパイル時に動的に評価されるacプリプロセッサディレクティブのようなものです。
したがって、それが本当に必要な定数であるかどうかを検討してください。コンパイル(またはクラスのロード)時に定義されるものです。
Interface
コードは含まれていません。
独自の定数を宣言および初期化する多くの特定のインターフェイスにインターフェイスを分割します。
Interface Segregation Principle
これは、役に立たない定数やメソッドによってクラスが退屈する必要がない場所に従います。
もちろん、Java では、クラスは一度に複数のインターフェースを実装できます。したがって、1 つの具体的なクラスを混同する特定のインターフェイスがある場合、これは非常に簡単です。
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;
}
}
}
次の方法で、条件付きの静的最終変数を設定できます。
public class Test {
public static final String test;
static {
String tmp = null;
if (condition) {
tmp = "ss";
}
test = tmp;
}
}
以下とのインターフェースでも、1行で実行できます。
public static final String test = condition ? "value" : "other value";
これは、Interface 定数が良くないもう 1 つの理由です。enums
以下の Likeを使用するだけです。
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;
}
}