5

私はJavaでかなり大きなプロジェクトに取り組んでいます。私の質問は、アプリケーションの一連のプロパティを最適に構成する方法についてです。

アプローチ 1: すべてのクラスからアクセスできる静的な Properties オブジェクトをいくつか用意します。(欠点: 次に、一部のクラスは、アプリケーションのコンテキストから取り出された場合に一般性を失います。また、別のクラスに配置され、将来消える可能性のある静的オブジェクトへの明示的な呼び出しも必要としますが、そうではありません。正しいと思います、私は間違っていますか?)

アプローチ 2: プロパティをメイン クラスによってインスタンス化し、他のアプリケーション クラスに渡す。(欠点: ほとんどすべてのクラスに Properties オブジェクトへのポインターを渡すことになり、非常に冗長で面倒になるようです。私はそれが好きではありません。)

助言がありますか?

4

9 に答える 9

7

プロパティの多くに Spring 依存性注入を使用するのが好きです。アプリケーションをビルディング ブロックのように扱い、プロパティを必要とするコンポーネントにプロパティを直接挿入できます。これにより、カプセル化が維持 (促進) されます。次に、コンポーネントをまとめて「メイン クラス」を作成します。

依存性注入の良い副作用は、コードがより簡単にテストできるようになることです。

于 2008-10-30T15:23:36.387 に答える
2

実際、アプローチ 2 は非常にうまく機能します。

最近のプロジェクトで Singleton プロパティ オブジェクトを使用してみました。その後、機能を追加するときが来て、Singleton を修正する必要があり、使用したすべての場所を見つけなければならなかったことを後悔しましたMySingleton.getInstance()

さまざまなコンストラクターを介してグローバル情報オブジェクトを渡すアプローチ 2 は、制御が簡単です。

明示的なセッターを使用することも役立ちます。

class MyConfig extends Properties {...}

class SomeClass {
    MyConfig theConfig;
    public void setConfi( MyConfig c ) {
        theConfig= c;
    }
    ...
}

これはうまく機能し、どのクラスが実際に構成情報を必要とするかを厳密に制御できたことを嬉しく思います。

于 2008-10-30T15:27:19.407 に答える
2

多くのクラスでプロパティが必要な場合は、アプローチ 1 を使用します。または、すべての静的メソッドの代わりにシングルトン デザイン パターンを使用するバリアントかもしれません。これは、いくつかのプロパティ オブジェクトを渡し続ける必要がないことを意味します。一方、これらのプロパティを必要とするクラスが少ない場合は、前述の理由により、アプローチ 2 を選択できます。また、作成したクラスが実際に再利用される可能性はどれくらいか、再利用される場合は、プロパティ オブジェクトも再利用することがどれほど問題になるかを自問することもできます。再利用の可能性が低い場合は、今は気にせず、現在の状況で最も簡単な解決策を選択してください。

于 2008-10-30T15:27:55.537 に答える
1

構成マネージャー コンポーネントが必要なようです。これは、ConfigurationManagerClass.instance(). これはすべての楽しみをカプセル化します。または、Spring のような依存性注入フレームワークを使用することもできます。

コンポーネントがアーキテクチャ内でお互いをどのように見つけるかに大きく依存します。他のコンポーネントが参照として渡されている場合は、それを行います。一貫性を保つだけです。

于 2008-10-30T15:25:06.697 に答える
1

システムプロパティを使用できる簡単なものを探している場合は、すべてのクラスで利用できます。String 値を保存するか、「もの」のリストを保存する必要がある場合は System.Properties() メソッドを使用できます。これは、HashTable である「Properties」オブジェクトを返します。その後、必要なものをテーブルに格納できます。見栄えはよくありませんが、グローバル プロパティを簡単に設定できます。YMMV

于 2008-10-30T18:49:32.773 に答える
0

アプローチ2は間違いなく優れています。

とにかく、他のクラスにconfigオブジェクトを検索させないでください。オブジェクトの外側の構成オブジェクトで取得した構成をインジェットする必要があります。

構成Implのヘルプについては、apachecommons構成を参照してください。

したがって、main()で

MyObject mobj = new MyObject();
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay);
mobj.setTrackerName(appConfig.getMyObjectTrackerName);

それ以外の

MyObject mobj = new MyObject();
mobj.setConfig(appConfig);

ここで、appConfigは、構成ファイル内の値の名前に基づいて値のすべてのルックアップを実行するapache構成ライブラリのラッパーです。

このようにして、オブジェクトは非常に簡単にテスト可能になります。

于 2008-10-30T16:25:25.887 に答える
0

メモリ内プロパティへの静的ポインターがあると、より快適になります。実行時にプロパティをリロードしたい場合や、静的参照を使用して実装しやすいその他の機能を使用したい場合があります。

どのクラスも島ではないことを覚えておいてください。再利用可能なクラスはクライアント クラスを持つことができ、コアをシングルトーン参照から解放します。

インターフェイスを使用することもできますが、無理をしないようにしてください。

于 2008-10-30T16:01:45.763 に答える
0

しばらく Java をやっていなかったのですが、プロパティを java.lang.System プロパティに入れることはできませんか? このようにして、どこからでも値にアクセスでき、「グローバル」なプロパティ クラスを持つことを回避できます。

于 2008-10-30T18:54:41.360 に答える
0

私は通常、共通のプロジェクトに存在し、名前空間をキーとするそれ自体のハッシュテーブルを含むシングルトン オブジェクトを使用し、それぞれのプロパティ クラスを作成します。

依存性注入も良い方法です。

于 2008-10-30T15:26:31.967 に答える