Javaでは、デフォルトでクラスメンバーが同じパッケージのメンバーがアクセスできるのはなぜですか? [複製

StackOverflow https://stackoverflow.com/questions/5358628

質問

この質問にはすでに答えがあります:

C ++とは異なり、データメンバーを宣言するときに「パブリック」または「プライベート」を指定しない場合、同じパッケージのどこからでもアクセスできることを理解しています。

Java言語のデザイナーは反対のものを選択したかもしれませんが、代わりに、デフォルトでクラスメンバーを(同じパッケージで)公開することを好みました。

理由は何ですか?

役に立ちましたか?

解決

彼らは公開されておらず、同じパッケージのメンバーがアクセスできます。 Javaの精神は、特定のパッケージが一貫した一連の責任を表すため、デフォルトでは相互運用できるはずです。

異なるセマンティクスを実施する場合は、いつでも特定のアクセスレベルを使用できます。

他のヒント

Javaのデフォルトの可視性はパッケージプライベートです。これは、同じパッケージからの場合、それらのエンティティにアクセスできることを意味します。デフォルトの可視性が公開されていると思う理由がわかりません。

彼らがJavaを発明したので、Sunからの決定を知りませんが、私見はあなたがプライベートクラスや公開クラスよりもはるかに頻繁にパッケージプリヴェのタイプが必要だからです。

たとえば、org.example.myapiでAPIを作成する場合**は、APIをできるだけ少ないクラスをシンプルに保つために、APIへの呼び出しを外部から必要とし、APIにできるようにする必要があるすべてのヘルパークラスを必要とします。彼らがすべきことは、外から見るべきではありません。ほとんどの場合、より多くのパッケージプライベートAPIヘルパークラスが必要です。

@Anoobはこれをコメントで書きました...そしてそれは徹底的な対応に値します。

Javaが、アクセサを作成する手間をかける必要がなかったため、Differenceクラスの1つのクラスのデータメンバーを(別のファイルで)設定させてくれたとき、私は嬉しく驚きました。より便利ですが、OOの原則の1つではありませんか?


実際にはOOよりも深いです。原則は、データカプセル化の原則であり、非OO設計にも適用されます。

アクセターと突然変異体の主な目的は次のとおりです カプセル 状態;つまり、クラスの実装の詳細がクラスの外に表示されないようにします。これを行う主な理由は2つあります。

  • それは、あなたがその内部状態へのアクセスを制御または防止する場合、クラスの動作についての推論を簡素化します。
  • 状態変数の実装タイプと不変性を簡単に変更できます。クラスを使用するコードがアクセサーズ /ミューテーター(つまり、ゲッター /セッター)のみを使用してオブジェクト状態にアクセスする場合、多くの場合、発信者からの変更の影響を隠しながら、クラスの状態表現と不変剤に変更を加えることができます。たとえば、些細な例です

    private int counter;
    public int getCounter() { return counter; }
    

    なります

    private long counter;
    public int getCounter() { return (int)counter; }
    public long getLongCounter() { return counter; }
    

Javaでアクセサ /ミューテーターを使用する理由はさらに2つあります。

  • アクセターまたはミューテーター法の動作は、通常 オーバーライド サブクラスで。対照的に、Javaでは、露出した属性の可視性をオーバーライドまたは変更することさえできません。

  • クラスに依存するフレームワーク /ツールがたくさんあり、Javabeans仕様の規則に続くメソッド名 /署名を備えたアクセサとミューテーターを備えています。

また、単純なゲッターとセッターのメソッドはJITコンパイラにインラリングされているため、パフォーマンスへの影響が最小限であることにも注意する必要があります。


アクセサーを作成することを避けようとする「面倒」と考えてはいけません。実際、アクセサ(および突然変異体)は、良質のJavaコードを書くことの重要な部分です。これは「ベストプラクティス」と見なされ、典型的なスタイル /バグチェッカープログラムは、露出した状態変数が問題としてフラグを立てます。

参照のためだけに:

アクセスレベル

--------------------------------------------------
Modifier    Class    Package    Subclass    World
--------------------------------------------------
public        Y         Y           Y         Y
protected     Y         Y           Y         N
no modifier   Y         Y           N         N
private       Y         N           N         N

彼らがデフォルトのアクセスレベルを作ったらもっと良かっただろうと単純に言う private. 。アイデアは、おそらく他の人が指摘しているように、 package パッケージは「協力的な責任の一貫したセットを表す」ため、アクセスレベルが最も頻繁に使用されるアクセスレベルです。)。しかし、それはそれであることが判明しました private 最も頻繁に使用されるアクセスレベルです。

IMO、Javaデザイナーは仕様を変更します private それらが時代型を持っている場合、デフォルトのアクセスレベル。

あなたの仮定は間違っています。フィールドはです いいえ デフォルトで公開。以下の表は、Javaのすべての視認性レベルを示しています。

Modifier    Class  Package Subclass World
public      Y      Y       Y        Y
protected   Y      Y       Y        N
no modifier Y      Y       N        N
private     Y      N       N        N

詳細はこちら: http://download.oracle.com/javase/tutorial/java/javaoo/accesscontrol.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top