なぜJavaにはサブクラスの可視性修飾子がないのですか?
質問
私は何度も、Javaでは不可能な変数の可視化を望んでいることに気づきました。 私は、特定のメンバーが自分のクラスとサブクラス内で見えるようにしたいのですが、パッケージの残りの部分や世界の残りの部分からは見えないようにしたいのです。 言い換えれば、私はこれを望んでいました。
Modifier Class Package Subclass World
sub-class Y N Y N
しかし、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
このようなことが必要になる典型的なケースは、抽象クラスを作成するときです。 時々、抽象的な親が特定のメンバーにアクセスする必要があることに気づきますが、具体的な子も同じようにアクセスします。 このアクセス権を与えるには、メンバを
protected
にすることで、このアクセスを与えることができますが、これはパッケージの残りの部分へのアクセスを、本当はしたくないのに開いてしまいます。
完全に明確にするために、私はそのような修飾子が
ではなく
であることは知っています。 私の質問は、なぜそのようなモディファイアがJavaに含まれていないのか、ということです。 それは、(私にとって)どちらかというと、より自然な可視性レベルであるように思われます。
protected
やデフォルトよりも自然な可視レベルだと思うのですが。 その理由は、含まれるほど重要ではないということなのでしょうか、それとも私が考慮しなかった副作用の可能性にもっと関係があるのでしょうか?
どのように解決するのですか?
非線形アクセス階層を持つことで、複雑さが増すのを避けたいのでしょう。
パッケージをコントロールすべきなので、単にそこでこれらの保護されたメソッドを呼び出さないようにすればいいのです。
(ちなみに
protected
とはちょっと違いますが
sub-class and package
とは異なり、非静的な protected メソッドは (同じパッケージ内にない場合) 宣言したクラスの任意のオブジェクトに対して呼び出すことはできず、 コードが含まれるサブクラスのオブジェクトに対してのみ呼び出すことができるからです。 (このことは
Object.clone()
で見ることができますが、これはオブジェクトがクローンされているクラスによってのみ呼び出すことができます)。
関連
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
-
[解決済み] なぜJavaにはSortedListがないのですか?
-
[解決済み] ポリモーフィズム vs オーバーライド vs オーバーローディング
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Javaでよくある構文エラー
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
強制型変換について
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
コンストラクタDate()が未定義である問題
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
switch case文のcaseの後の列挙定数は列挙型なし