java.lang.Object が抽象的ではないのはなぜですか? [重複] 質問する

java.lang.Object が抽象的ではないのはなぜですか? [重複] 質問する

重複の可能性あり:
Java: Object クラスが抽象クラスとして宣言されていない理由

Java のすべての基本クラスである Object クラスが抽象クラスではないのはなぜですか?

この質問は本当に長い間ありましたが、ここでは純粋に好奇心から尋ねているだけです。抽象的ではないため、私のコードや他の人のコードに問題はありませんが、なぜ具体的なものにしたのか疑問に思っていました。

この Object クラスの「インスタンス」(存在、つまり参照ではない)がなぜ必要なのでしょうか。1 つのケースは、ロックに Object のインスタンスを使用する、不十分な同期コードです (少なくとも私は 1 度このように使用しました。私のミスです)。

Object クラスの「インスタンス」には実用的な用途がありますか? また、そのインスタンス化は OOP にどのように適合しますか? それを抽象としてマークしていたら (もちろん、そのメソッドに実装を提供した後)、どうなっていたでしょうか?

ベストアンサー1

デザイナーからのjava.lang.Object指示がなければ、私たちは意見に基づいて答えなければなりません。それを明らかにするのに役立つ質問がいくつかあります。

Object のメソッドのいずれかが抽象化によって恩恵を受けるでしょうか?

いくつかのメソッドは、この方法から恩恵を受けると言えるでしょう。たとえば、hashCode()とを取り上げequals()ます。これら 2 つが両方とも抽象化されていれば、おそらくこれらの複雑さに関するフラストレーションは大幅に軽減されていたでしょう。これにより、開発者はこれらを実装する方法を理解する必要があり、一貫性を保つ必要があることがより明白になります (Effective Java を参照)。ただし、、およびは、別個hashCode()のオプトイン抽象化 (つまり、インターフェース) に属するというのが私の意見です。その他のメソッド、、、などは十分に複雑であり、ネイティブであるため、すでに実装されていて、抽象化による恩恵を受けないのが最善です。equals()clone()wait()notify()finalize()

したがって、答えは「いいえ」になると思います。Object のメソッドはどれも抽象化によってメリットを得ることはありません。

Object クラスを抽象としてマークするとメリットがありますか?

すべてのメソッドが実装されていると仮定すると、Object を抽象としてマークすることによる唯一の影響は、オブジェクトを構築できない (つまり、new Object()コンパイル エラーになる) ことです。これには利点がありますか? 「オブジェクト」という用語自体が抽象的である (周囲に「オブジェクト」として完全に説明できるものを見つけられますか?) ため、オブジェクト指向パラダイムに適合すると思います。ただし、純粋主義者開発者に具体的なサブクラスの名前を選ばせることで、たとえ空であっても、開発者の意図をよりよく表現するコードが生まれるという主張もある。正しいパラダイムの観点から言えば、Object は とマークされるべきですabstractが、結局のところ、実際の利点はなく、これは設計上の好み (実用性 vs. 純粋さ) の問題です。

同期に単純なオブジェクトを使用するという慣行は、同期を具体的にする十分な理由になりますか?

他の回答の多くは、操作で使用するプレーン オブジェクトの構築について述べていますsynchronized()。これは一般的で受け入れられている方法かもしれませんが、設計者がそれを望んだ場合、Object を抽象化することを妨げる十分な理由にはならないと思います。他の回答では、特定のオブジェクトで同期したいときはいつでも Object の単一の空のサブクラスを宣言する必要があると述べられていますが、これは成り立ちません。SDK (java.lang.Lockまたはその他) で空のサブクラスを提供して、同期したいときはいつでも構築できるようにすることもできました。これを行うと、意図をより強く表明できるという利点が追加されます。

オブジェクトを抽象化することで悪影響を受ける可能性のある他の要因はありますか?

純粋なデザイン観点とは別に、選択に影響を与えた可能性のある領域がいくつかあります。残念ながら、それらについて詳しく知ることはできません。ただし、これらのいずれかが決定に影響を与えたとしても驚きではありません。

  • パフォーマンス
  • 安全
  • JVMの実装のシンプルさ

他に理由があるのでしょうか?

これはリフレクションに関係している可能性があると言われています。ただし、リフレクションは Object が設計された後に導入されました。したがって、それがリフレクションに影響するかどうかは議論の余地があり、理由ではありません。ジェネリックについても同様です。

java.lang.Objectは人間によって設計されたという忘れられない点もあります。人間は間違いを犯したかもしれませんし、質問を考慮しなかったかもしれません。欠陥のない言語は存在しません。5月そのうちの 1 つかもしれませんが、もしそうだとしても、それは決して大きな問題ではありません。そして、私は、野心に欠けることなく、これほど広く使用されているテクノロジー、特に 15 年 (?) も使用され、今もなお健在であるテクノロジーの主要部分の設計に私が関わる可能性は非常に低いと自信を持って言えると思います。したがって、これは批判と見なされるべきではありません。

そうは言っても、私はそれを抽象的にしたでしょう;-p

まとめ
基本的に、私が見る限り、「なぜ java.lang.Object は具体的ですか?」または (もしそうなら)「なぜ java.lang.Object は抽象的ですか?」という両方の質問に対する答えは...「なぜそうではないのですか?」です。

おすすめ記事