1

このスレッドを読んで思いついた小さな質問があります: なぜ静的変数は悪と見なされるのですか?

私のアプリケーションでは、非常に大量の設定変数があります。たとえば、フォント、色、キャッシュされた画像など...それらのほとんどは変更されないため、静的であると考えました。それにもかかわらず、私のアプリケーションはアプレットであり、クライアントがアプレットを一度実行しているため、特定の構成が変更された可能性があるため、これらの静的情報の一部が変更される可能性があります。したがって、この種のデータはめったに変更されることはありませんが、最終的なものとは見なされません。

さらに、そのように処理する情報の量は膨大であるため、次のように独自の列挙型にそれらをマッピングしました。

public enum Fonts {

    COLOR_CHOOSER, MAP_META_DATA; 
    private Font localFont;

    public Font getValue() {
        return localFont;
    }

    private void setValue(Font newFont) {
        localFont = newFont;
    }
}

protected static void initFonts() {
    Fonts.COLOR_CHOOSER.setValue(new Font("Arial", Font.PLAIN, 15));
    Fonts.MAP_META_DATA.setValue(font_race.deriveFont(Font.BOLD, 11));
}

そのような列挙型を使用することで、探している値を非常に簡単に特定でき、それらすべてを 1 か所で管理できます。

これは静的なので、代わりにオブジェクト内に配置することもできますが、とにかく使用されます。それにもかかわらず、私は現在の動作の方が読みやすいと考えました。

それに加えて、initFonts() メソッドは、将来、json や xml などの外部ソースから現在ハードコードされている値を取得するマッピング メソッドに置き換えられます。したがって、オブジェクト指向で作業する場合、これは、受信データを対応するオブジェクトに転送することを意味します。これは、読みにくいと考えています。

私の質問を考え出すには:あなたの誰かが最終パラメータの途中でどのようにマップ/キャッシュしますか(キー値として列挙型を持つハッシュマップを持つことも検討しました)。たとえば、画像、フォント、色、ピクセル マージンなどの場合です。これらの列挙型を使用する方法は適切ですか、それとも静的であるため悪であると見なすことができますか? はいの場合 - 読みやすく、維持しやすい適切な方法は何ですか?!

私は可能な方法であるという私の解決策を考えましたが、上記のスレッドを読んだ後、デザイン全体を再考するつもりでした.

アドバイスありがとうございます。敬具。

4

1 に答える 1

0

列挙型は静的な最終initFonts()データを表すのに問題ありません。そのため、プライベート メソッドを使用している場合でも、列挙値の内容を変更するようなメソッドを使用するのは適切ではないと思います。あなたが持っているべきものはもっと似ています:

public enum Fonts {
    COLOR_CHOOSER(new Font("Arial", Font.PLAIN, 15)),
    MAP_META_DATA(new Font("Arial", Font.BOLD, 11)); // No reference to font_race, of course

    private final Font localFont;

    private Fonts(Font font) {
        localFont = font;
    }

    public Font getValue() {
        return localFont;
    }
}

あなたの種類の構成データが最終的なものではないとあなたが言う理由がわかりません。アプリケーションの実行中に変更されないようです。

ただし、実行時の初期化で、コンパイル時に決定されるのではなく、変更される可能性のある値をロードする必要がある場合、単純な方法で値自体を初期化できない場合 (あまりにも多くのものを呼び出す)、列挙型はもはや正しいモデルではない可能性があります。列挙型の静的イニシャライザから実行するのは最善の策ではないかもしれません)。その場合、列挙型の直接使用を中間サービスに置き換えます。たとえば、適切なメソッドを使用して一度だけ初期化された不変Map<Fonts, Font>( でEnumMap<Fonts, Font>ラップされている可能性があります) を保持し、 を呼び出す代わりに、 .Collections.unmodifiableMap()Fonts.COLOR_CHOOSER.getValue()FontService.getFont(Fonts.COLOR_CHOOSER)

于 2012-12-17T13:21:47.093 に答える