2013-08-11 11 views
5

私のJavaプロジェクトの多くは、データベースを広範囲に使用しています。通常は、property.xmlというファイルをすべての文字列と設定を保持することです。Javaではどのようなグローバル変数が悪い習慣ですか?

そして、私はクラスCNSTを持っていて、xmlファイルのものに対応するすべての静的定数を保持します。

これらの定数は、プログラムの開始時にxmlファイルで一度初期化され、プログラムの後のどこでもグローバルとして使用されます。

しかし、最近多くの記事を読んだ後、グローバルを使用することはあまり良いことではないようです。だから誰もこの状況の良い習慣を示すことができますか?ありがとう。

+0

代わりにリソースファイルを使用します。「プロパティ」を参照してください。 – nachokk

答えて

1

一般的にグローバル変数は可能な場合は避けるべきですが、これは定数であれば問題ありません。あなたは(おそらく)先頭のオブジェクトと何もラッパー、このグローバル設定を初期化する。このような場合のために、これらのオプションがあり、その後変更されます。staticブロックに初期化され

  • 持つ定数(public static finalが)
  • 変数を持つprivate static finalstaticブロックに初期化され、ゲッター
  • シングルトンを作成し、変数を有する介して露出private finalゲッターを介して露出

2番目と3番目のポイントは、ゲッターメソッドでは変数の値をカプセル化し、それに依存する(呼び出し)コードに影響を与えずに呼び出しメソッドに返される値を操作するコードを変更/挿入できます。

+0

これは素晴らしいです、ありがとう。しかし、2番目と3番目のオプションは、どちらが良いでしょうか?私は[Javaのグローバル定数を公開するより良い方法は何ですか?](http://stackoverflow.com/questions/18169614/what-is-the-better-way-of-publishing-global-constants -in-java)、見てください、ありがとう – Will

0

パブリック静的定数または変数を自由に使用できます。非静的変数を使用する場合、ゲッターとセッターを使用することをお勧めします。あなたのクラスが静的な定数だけを持つ場合、プライベートコンストラクタを使ってこのクラスのインスタンスを作成することもできます。

public class Global { 

    public static final int A; 
    public static final int B; 

    private Global() {} // use only when you have only static fields and methods 

    static { 
     A = 1; 
     B = 2; 
    } 
} 
+0

はい、これはまさに私がやったことです。しかし、「グローバル=ひどい」についてのこれらの記事は、私を少し驚かせる。 – Will

+0

これはJavaでは普通で便利な方法です。あなたはこれらの構造を使うことができ、これは "ひどい"練習ではありません。おそらく、非静的フィールドと非constフィールドについて記事で怒られたのでしょうか? –

+0

それは変わっていないかもしれないと言う人もいましたが、それは「OKかもしれませんが、それは私が最初に不思議に思った記事の主なトーンほど強くはありません。とにかく、これが良い練習であると確信している限り、それは問題ありません。可変グローバルの短所をもう少し詳しく見ていきます。ありがとう – Will

0

あなたは良いアイデアだろうpublic static変数の代わりに、グローバル変数を作成することができます。

これをチェックアウトするlink

もう一つのアプローチは、singletonパターンに従うクラスを作成することであり、これだけがクラスの1つのインスタンスであるとシングルトンクラスの変数を維持し、getset方法でそれにアクセスすることができます。

EDIT1: -

移動定数を宣言した場合の古いスタイルのために。次のようなもの: -

(public/private) static final TYPE NAME = VALUE; 

この場合、クラスを作成することはお勧めしません。

+0

それは私がやったことです。私はすべての私のパブリック静的変数を保持するためにクラスを使用したので、それらを定数としてグローバルに使うことができました。私は今、ちょっと混乱しています、私はそれをこのようにするべきですか? – Will

+0

はい、これは良い考えです。 –

+0

私の答えに記載されているようにシングルトンクラスを作成し、getおよびsetメソッドを使って変数にアクセスすることができます。これは、グローバル変数を使用する方がずっと良い方法です。 :) –

1

グローバル変数を使用するということは、データを操作できる多くのクラスから見えることを意味します。

だから、あなたは広く見えているあなたのデータを世話しなければならないでしょう。

マルチスレッドを使用している場合は誰でもそのデータを変更できるため、データが破損する可能性があります。

実際の問題として、私は以下の点に従ってください。

  1. は、可能ならば、民間、最小限の変数可視性を保ちます。
  2. 可能な限り変更しないでください。
+0

グローバル変数が定数であればOKですが、それは意味ですか? – Will

+0

うん、定数はグローバルにすることができます。実際には、定数として使用される最終的な静的変数を持っているなら、それは有益です。 – Lokesh

関連する問題