条件付きでインターフェースを実装する方法があるかどうか、または私がやりたいことの回避策があるかどうかを尋ねたいと思います。メッセージの印刷に使用される文字列である非常に多数の最終変数のみを保持する2つのインターフェイスLangAとLangBを作成したいと思います。ご想像のとおり、LangAは1つの言語であり、LangBは別の言語です。私が欲しいのは、メッセージ処理クラスに、システムのロケールに基づいて必要なインターフェースを条件付きで実装させることです。カスタムibraryを使用しても、これが可能かどうかはまったくわかりません。不可能な場合は、少なくとも回避できるかどうかを説明してください。(簡単な質問:これはScalaで可能ですか?ありがとう!)
クラスのコンストラクターがロケールをチェックし、各言語のファイナルのみを特徴とするメソッドレスクラスの値に基づいて独自のファイナルを設定する可能性はありますが、リソース効率があまり高くない可能性があります(例:コンストラクターはロケールがlocAであることを学習するため、ファイナルを設定しますmyF1 = LangA.myF1; myF2 = LangB.myF2;など)よろしくお願いします。
2 に答える
いいえ、これは不可能です。
「クラスXはインターフェイスYを実装します」の関係はコンパイル時に固定され、実行時に変更することはできません。
ただし、インターフェイスを使用して定数をクラスにインポートすることは、Java1.0にまでさかのぼるソリューションです。このアンチパターンは、新しい開発には使用しないでください。
さらに、コンパイル時定数を使用したローカリゼーションは、Javaのネイティブソリューションではありません。リソースバンドルを使用してローカライズする必要があります。
実行時に実装を切り替える方法が必要な場合は、定数をインターフェイスのメソッドに置き換え、異なる定数を返す実装を提供します。
interface Constants {
double getAccelerationDueToGravity();
}
class EarthConstants implements Constants {
double getAccelerationDueToGravity() {
return 9.8;
}
}
class MarsConstants implements Constants {
double getAccelerationDueToGravity() {
return 3.71;
}
}
申し訳ありませんが、これは良いデザインではありません。メッセージが多数ある場合は、それらをデータベースに保存し、メモリで検索できるオブジェクトにキャッシュすることをお勧めします。
定数だけを保持するインターフェースのアイデアは、長い間信用を失っています。
インターフェースは、定数ではなく、メソッドと動作を分離することに関するものでなければなりません。
Map
これらがロケール固有であるという考えは、データベースまたはメッセージバンドル、またはキーとしてのProperty
値の-それを待つ-をさらに強く指し示しLocale
ます。
固執する必要がある場合は、継承よりも構成の方がチャンスがあります。Springのような依存性注入エンジンを使用して、必要なメッセージをオブジェクトに注入できますBeanFactory
。
あなたが投稿したアイデア以外のもの。