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堂课

恕我直言,这取决于第一次编写课程时的风格,因为以后有一点理由改变它。

于 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 回答