2011-02-01 18 views
5

なぜ私は他人のコードを読むときに私は頻繁に "グローバル変数"を頻繁に使用するのですか? Javaコードで例えばグローバル変数の使用

public class SomeClass { 
    Button btn1; 
    private void someMethod() { 
     btn = new Button(); 
    } 
} 

btn1が「グローバル」と「便利」変数として宣言され、クラス全体に簡単にアクセスとして使用されます。ただし、修飾子がない場合は、デフォルトでJavaのデフォルトアクセスになります。

セキュリティ上のリスクはありますか?特定のクラスでのみ使用する予定の場合は、なぜすぐにプライベート修飾子を使用して宣言しませんか?

+7

私はこれらの "人"が誰かを知らない、私は常に私のフィールドを私的に宣言します。 – biziclop

+0

一般的にあなたは正しいです、それはバグにつながる可能性があります。 – Maxym

+0

質問(回答が可能です)を使用してください。 "プライベートではなく、デフォルトのアクセス修飾子を使用する理由は何ですか?" – Zeemee

答えて

3
  1. BTN1がグローバル変数ではないような適切な + conspiricy理論家を削除します。
  2. アクセス修飾子が指定されていない場合は、デフォルトで「パッケージ」レベルのアクセスが許可されます。つまり、SomeClassと同じパッケージに属するすべてのクラスがbtn1にアクセスできます。
  3. SomeClassがちょうどデータ保持者と不変(セッターなどはありません)、これは完全にOKです。
  4. インスタンス変数については、可能な限り制限をかけないほうがよいでしょう。
+3

私は4に完全に同意していません。私はいつも変数でできるだけ制限的であることが最善だと思います:一般的にそれらを非公開にして、もしそれらを「最終」にすることができれば、そうします。 –

+0

@Jon Skeet - 私の悪い私はもっと言いたいと思っていた...英語は第1言語ではない;-) –

+1

フェア十分な:)私はまだポイント3と意見が違うが、そこに行く... –

5

グローバル変数はありません(このようなことはJavaでも存在しますか?私はグローバルの定義に依存していると思います)。それはまだクラスのメンバーです。

The default visibility is package-privateなので、変数はパブリックではなく、同じパッケージ内の他のクラスからアクセスできます。

通常、「最適な」データカプセル化に努めるべきですが、これが適切であるユースケースがあるかもしれません。

+1

Javaのグローバル変数に最も近いのは、おそらく 'final'ではなく' public static'変数でしょう。 –

+0

'final'とは何が関係していますか? 'public static'は参照が不変であってもグローバルです。 –

+0

@Steve:もしそれが 'final'だったら、それを「変数」と呼ぶのではなく、むしろ定数(はい、タイプは変更可能かもしれません...)。 –

1

プライベート/パブリックはセキュリティとは何の関係もありません。コードを使用してスコープ/使用を制限することです。

それでも、それらを呼び出すのがよい習慣です。プライベートにする必要がある場合はプライベートにする必要があります。

1

javaには「グローバル」というものはありません。公開、非公開、保護された、既定のみが存在します。デフォルトでは、クラス変数はカプセル化を中断するので、一般的には嫌われます。

特定のクラスでのみ使用する予定の場合は、すぐにプライベート修飾子を使用してそれらを宣言しないのはなぜですか?

*彼らは無知なので/ +

あなたを困らせるためにアウト/いたずら/気にしない*だけ

3

これはグローバル変数ではありません。デフォルトのアクセス権を持っているため、グローバルには表示されません。インスタンスメンバーです。つまり、SomeClassのスコープになっています。 Javaのグローバル変数に最も近いものは、パブリッククラスのpublic staticフィールドです。その場合でも、使用しているコンテナクラスのクラスローダに関しては、グローバルでしかありません。同じJVMで実行されている別のクラスローダで、同じコンテナクラスをロードすると、別々の静的変数があります。

私は個人的にはカプセル化を助けるためにプライベート以外のフィールドであることを個人的に認めていません。フィールドはクラスの実装の一部であり、クラスのAPIにのみ依存している人には影響を与えずに変更可能でなければなりません(これはもちろん、独自のカプセル化を与えるものではありません)。 。

1

あなたの質問は

なぜ人々は

すぐprivate修飾子とそれらを宣言していないされている場合は、私の答えは次のようになります。彼らは怠け者なので。