2
public class Collections {
    // Suppresses default constructor, ensuring non-instantiability.
    private Collections() {
    }
...

含まれているすべてのメソッドは静的です。似たようなものをコーディングしていた場合、Collections.class を抽象化しますが、まだプライベート コンストラクターがあります。クラスが抽象として定義されていないのはなぜですか?

4

5 に答える 5

8

クラスであるということは、それが拡張abstract可能である (そして拡張されることを意図Collectionsしている) ことを意味しますが、クラスの場合はそうではありません。それは私の推測です。

于 2012-04-17T16:21:35.893 に答える
5

このCollectionsクラスは、拡張またはサブクラス化することを意図したものではなく、静的ユーティリティ メソッドのプロバイダーであることのみを意図しています。それが抽象的であれば、ユーザーはそれをサブクラス化できますが、JDK 設計者はそれを望んでいませんでした。

于 2012-04-17T16:21:45.680 に答える
4

あなたはそれを作ることができました

  • abstractクラス_
  • またはenumインスタンスのない
  • またはfinalクラス

IMHO、後で変更する理由はほとんどないため、クラスが最初に作成されたときのフレーバーによって異なります。

于 2012-04-17T16:21:59.237 に答える
2

その「技術的」側面 (つまり、インスタンス化できない) に加えabstractて、ライブラリのユーザーに面するセマンティックな側面があります。つまり、他のユーザーがクラスを拡張する意図を伝えます。これは で行うことが期待されているものではないCollectionsため、マークするabstractのは間違いです。

于 2012-04-17T16:22:16.807 に答える
1

これは一般的な方法であり、静的メソッドのみを持つユーティリティ クラスで使用されます。インスタンスメソッドが定義されていないため、クラスを抽象化しても意味がありません。誰かが不要なインスタンスを作成するのを防ぐためです。

List<String> myList = Arrays.asList("b", "c", "a");
new Collections().sort(myList);

どこ

List<String> myList = Arrays.asList("b", "c", "a");
Collections.sort(myList); 

ユーティリティ クラスを使用する「正しい」方法です。

于 2012-04-17T16:24:29.707 に答える