class MyClass
{
public static final int num=90;
}
- 非パブリック クラスでパブリック メンバーを作成できるのはなぜですか?
- 私が知らないこのメンバーにアクセスする別の方法はありますか (クラス名以外)?
class MyClass
{
public static final int num=90;
}
あなたの質問はmembersに関するものだったので、フィールドとメソッドの両方に対処します (非静的。Anthony Accioly の回答は、静的フィールドも含む別の適切なユース ケースに触れています)。
多くの場合、これは言語の文法のあいまいな結果にすぎませんが (特に、スニペットの例のように、非パブリック クラスのパブリックフィールド)、パブリックメソッドを非パブリック クラスで使用できるようにする必要がある非常に正当な理由があります。公開クラス。
Mik378 の回答を拡張して、たとえば次のように考えます (不自然な例):
import ...;
class BleebleAscendingComparator implements Comparator<Bleeble> {
@Override public int compare (Bleeble o1, Bleeble o2) { ... }
}
class BleebleDescendingComparator implements Comparator<Bleeble> {
@Override public int compare (Bleeble o1, Bleeble o2) { ... }
}
public class BleebleView {
public enum SortMode { ASC, DESC };
public Comparator<Bleeble> getDisplayOrderComparator (SortMode mode) {
if (mode == SortMode.ASC)
return new BleebleAscendingComparator();
else
return new BleebleDescendingComparator();
}
}
これらの実装の 1 つをそのコンテキストの外部で直接インスタンス化することはできませんComparator
が、 のパブリック メソッドをオーバーライドする必要がありComparator
、それらの機能にはComparator
インターフェイスを介してアクセスできます。
これと同じ理由が、たとえば内部クラスにprivate
も当てはまります。protected
メソッドを宣言できなければ、継承するインターフェースのメソッドや継承するクラスをpublic
オーバーライドする方法がありません。public
実際の例:
これは、匿名の内部クラスで public メソッドをオーバーライドするたびに (たとえば、 anonymous でオーバーライドするたびに)public void actionPerformed
使用しActionListener
ます。
に格納したい非公開クラスを検討してくださいHashMap
。その非パブリック クラスの publicequals()
とをオーバーライドすると、クラスが非パブリックであるという事実に関係なく、 の実装でそれらにアクセスできます。hashCode()
HashMap
オーバーライドされることが多いpublic toString()
のは、パブリックでない可能性のあるクラスのパブリック メンバーのもう 1 つの一般的な例です。
より複雑な例は、java.sql.DriverManager での使用ですjava.sql.Driver
(一般に、ファクトリ タイプの設計ではこの概念を多用します)。SQL ドライバの実装では、実装クラスをパブリックにしない場合があります (たとえば、Oracleドライバは非パブリックを生成します)。Connection
オブジェクト)。
他にもたくさんあります...この例に目を光らせていると、実際にどれほど一般的であるかに驚かれることでしょう!