web-dev-qa-db-ja.com

Javaには「プライベート保護」アクセス修飾子がありますか?

Javaのprivate protectedと呼ばれるアクセス修飾子(両方の単語を一緒にしたもの)を参照する参照がいくつかあります。

private protected someMethod() {

}

これについて言及しているページの1つは here です。私の学校の授業でも、このアクセス修飾子に言及しました(そして、それは存在すると言いました)。ただし、これを使用すると、Java言語でエラーが発生します。

変数とメソッドの両方を試しましたが、存在しないことは確かですが、何が起こったのか説明が必要です。それは考慮され、その後拒否されましたか?または、Javaの新しいバージョンで削除されましたか?

編集:protectedキーワードに関する情報を探していません。

160
user6754053

アクセス修飾子の削除

Javaには元々private protected修飾子がありましたが、JDK 1.0.2(最初のstableバージョン、Java今日は1.0を知っています)。 JDK 1.0.2に関するいくつかのチュートリアル( here および here )は次のように述べています。

注:Java言語の1.0リリースは、5つのアクセスレベルをサポートしました。上記の4つとprivate protectedです。 private protectedアクセスレベルは、1.0より高いJavaのバージョンではサポートされていません。 Javaプログラムで使用しないでください。

別の SoftwareEngineering.SEに関する回答 状態:

Javaには元々そのような修飾子がありました。 private protectedと書かれていましたが、Java 1.0で削除されました。

Javaバージョン履歴 を見てください:

JDK 1.0

最初のバージョンは1996年1月23日にリリースされ、Oakと呼ばれていました。 最初の安定バージョンであるJDK 1.0.2は、Java 1。と呼ばれます

これから、バージョン1.0.2に関するチュートリアルは、最初のバージョンであるJDK 1.0を参照し、言語はOakと呼ばれていましたが、SoftwareEngineering.SEのチュートリアルは_と呼ばれる最初の安定バージョンであるJDK 1.0.2を参照しています。Java 1.0、削除された場所。

Java 1.0ドキュメント で検索しようとしても、それは見つかりません。前述のように、JDK 1.0.2で削除されていたため、別名Java 1.0。これは、投稿したリンクの「Last Modified」時間を見ると再び証明されています。投稿したリンクは1996年2月に最後に変更されました。Java 1.0/JDK 1.0.2は、private protectedが削除されたときにリリースされました1996年2月以降 1996年8月の仕様による。

削除の理由

this oneなど、private protectedの理由を説明するソースもあります。引用するには:

プライベート保護されたものは何ですか?

早い段階で、Java言語は修飾子の特定の組み合わせを許可し、その1つはprivate protectedでした。 private protectedの意味は、可視性をサブクラスのみに制限することでした(そしてパッケージアクセスを削除します)。これは後にやや一貫性がなく、過度に複雑であると見なされ、サポートされなくなりました。[5]

[5] protected修飾子の意味はJavaのBeta2リリースで変更され、private protectedの組み合わせが同時に登場しました。彼らはいくつかの潜在的なセキュリティホールを修正しましたが、多くの人々を混乱させました。

また、SoftwareEngineering.SEは、矛盾や余分な複雑さの価値はないと言って、これをサポートしているため、早期に削除されました。

解釈

このすべての私の解釈は、おそらくオークの時代に、両方が共存することを許可されていたということです(したがって、組み合わせ)。 protectedの意味が変更されたため1privateprotectedを同時に許可する必要があるかもしれません。導入は複雑すぎて価値がなかったため、最終的に削除されました。 Java 1.0/JDK 1.0.2がロールバックする頃には、ドロップされていたため、ドキュメントで見つけることができませんでした。


1Oak Language Specification 、セクション4.10、変数およびメソッドへのアクセスでは、デフォルトの修飾子がprotectedであったことに注意してください。

デフォルトでは、クラス内のすべての変数とメソッドはprotectedです。

これは、今日のデフォルトパッケージアクセスとはまったく異なります。 privateの制限が厳しく、protectedの許容度が高すぎるため、これはprivate protectedの必要性に道を開いた可能性があります。

191
Li357

紛らわしい/不明瞭なストーリーがあります:

1つ目は、Princetonのソース、および MITアーカイブ のソースです。

注:Java言語の1.0リリースは、5つのアクセスレベルをサポートしていました:上記の4つとプライベート保護されています。プライベート保護アクセスレベルは、1.0より高いJavaのバージョンではサポートされていません。 Javaプログラムで使用しないでください。

ただし、この機能はJava 1.0 here または here の公式ドキュメントでは指定されていません。

私の推測では、公式の言語仕様は1996年8月からであり、プリンストンのソースは最後に変更されたため、この機能は公式の1.0バージョンに到達しなかったと思われます 1996年2月

PS:古いバージョンのアーカイブを削除することに対するOracleの恥。

52
m0skit0

あなたの質問で提供したリンクが示唆するように、private protectedはクラスのelement/memberで使用され、subclassが要素にアクセスできるようにしたいが、 package

Javaは、C++と比較した場合、要素をカプセル化するという特別な概念があり、それはPackageです。 Javaprivate、およびpublicなどのアクセス指定子に関しては、protectedのパッケージ内外でアクセス可能なものを理解する必要があります。

なぜそれが使用されたのか説明したことに注意してください。もちろん現在のバージョンではありません

11
Game_Of_Threads

いいえ、privateprotectedの両方を一緒に使用することはできません。あなたのチュートリアルは奇妙です。あなたが持っているのは、いわゆるパッケージプライベートまたはot6参照パッケージ保護アクセスです。これは、acc6修飾子が明示的に記述されていない場合に有効になるデフォルトのアクセスです。

0
AlexR