1. ホーム
  2. java

[解決済み] Javaには "private protected "というアクセス修飾子があるのですか?

2022-04-25 14:18:26

質問

Java のアクセス修飾子である private protected (両方の単語を合わせて)。

private protected someMethod() {

}

これを参考にしているページのひとつが こちら . 私の学校の授業でも、このアクセス修飾子について言及しました(存在すると言っていました)。しかし、これを使うと、Java言語ではエラーになります。

変数とメソッドの両方で試したので、存在しないことは間違いないのですが、何が起こったのか説明が欲しいです。検討された後、却下されたのでしょうか?それとも、Javaの新しいバージョンで削除されたのでしょうか?

編集: 私は protected キーワードを使用します。

どのように解決するのですか?

アクセス修飾子の削除

Javaはもともと private protected モディファイアは、JDK 1.0.2 で削除されました(最初の 安定した のバージョンで、現在私たちが知っているJava 1.0です)。JDK 1.0.2に関するいくつかのチュートリアル( こちら こちら )は次のように言っています。

注:Java言語の1.0リリースでは、上記の4つに加え、5つのアクセスレベルをサポートしていました。 private protected . その private protected アクセス・レベルは、Java 1.0 以降のバージョンではサポートされていません。

別の SoftwareEngineering.SEに関する回答 が記載されています。

Javaにはもともとこのようなモディファイアがありました。それは次のように書かれていた。 private protected が、Java 1.0で削除された。

では、次に Javaバージョン履歴 :

JDK 1.0

最初のバージョンをリリースしたのは 1996年1月23日 という名前になりました。 最初の安定版であるJDK1.0.2は、Java 1と呼ばれている。

このことから、バージョン1.0.2に関するチュートリアルは、言語がOakと呼ばれていた一番最初のバージョン、JDK 1.0を指していますが、SoftwareEngineering.SEのものは、それが削除されたJava 1.0という最初の安定版、JDK 1.0.2について述べていると結論づけることができます。

ここで、試しに検索してみると 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月です。

削除理由

の理由を説明する資料もあります。 private protected のようなものです。 これ の1つです。引用すると

プライベートは何を守ったのか?

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

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

そして、SoftwareEngineering.SEもこれを支持し、「矛盾や余計な複雑さに見合わないので、早い段階で削除した」と述べています。

解釈

私の解釈では、もしかしたら、オーク時代には両者の共存が許されていたのかもしれません(だから、この組み合わせなのでしょう)。ということは protected の意味が変わりました。 1 を許可する必要があったかもしれません。 privateprotected を同時進行させました。導入が複雑になりすぎて割に合わなくなったため、最終的に取りやめになった。Java 1.0/JDK 1.0.2の頃には、この導入は中止されており、したがってドキュメントで見つけることはできません。


1 での オーク言語仕様 の、4.10節をご覧ください。 変数とメソッドへのアクセス であったことが指摘されており、デフォルトのモディファイアは protected :

デフォルトでは、クラス内のすべての変数とメソッドは プロテクト .

これは、現在のデフォルトのパッケージアクセスとは全く異なるものです。の必要性への道を切り開いたと言えるかもしれません。 private protected というのも private は制約が多すぎるし protected は甘すぎる。