コンパイラのエラーは既にそれを言います。大文字と小文字のラベルは定数式でなければならず、クラスリテラルやその上にgetSimpleName()
を呼び出した結果も定数式ではありません。
作業溶液は次のようになります。
String tableName = "MyClass1";
...
switch (tableName) {
case "MyClass1":
return 1;
case "MyClass2":
return 2;
default:
return Integer.MAX_VALUE;
}
表現MyClass1.class.getSimpleName()
が"MyClass1"
よりも簡単ではありませんが、もちろん、名前は既存のクラスとリファクタリングツールと一致するかどうかを任意のコンパイル時のチェックがありません。または難読化者はクラスMyClass1
と文字列リテラル"MyClass1"
の間の関係に気付かない。
解決策はありません。問題を軽減するためにできる唯一のことは、関連付けられたクラス内のキーを宣言して関係を文書化することです。
class MyClass1 {
static final String IDENTIFIER = "MyClass1";
...
}
class MyClass2 {
static final String IDENTIFIER = "MyClass2";
...
}
...
String tableName = MyClass1.IDENTIFIER;
...
switch (tableName) {
case MyClass1.IDENTIFIER:
return 1;
case MyClass2.IDENTIFIER:
return 2;
default:
return Integer.MAX_VALUE;
}
これは、読者との関係を文書化しますが、ツールは、まだ実際の文字列の内容は、クラス名と一致していることを確認しません。しかし、達成したいことに応じて、文字列の内容がクラス名と一致するかどうかは現在無関係になるかもしれません...
文字列を最終的なStringローカル変数に割り当てることはできますか? –
どのJavaバージョンですか? Java 7/8で異なる結果が得られます。 – Marged
@Marged私はJava 8を使用していますが、どちらのバージョンのソリューションにも興味があります。 – dedek