1. ホーム
  2. java

なぜJavaにはサブクラスの可視性修飾子がないのですか?

2023-09-07 06:53:22

質問

私は何度も、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() で見ることができますが、これはオブジェクトがクローンされているクラスによってのみ呼び出すことができます)。