この記事は主にjava.lang.Math
、 、java.util.Arrays
、java.util.Collenctions
などの一部のツール クラスを対象としています。これらのクラスのメソッドはすべて静的メソッドです。主に、これらのクラスのインスタンス化には意味がないため、設計者はこれらのクラスがインスタンス化されることを望んでいません。
このとき、コンストラクターをプライベートに設定することで非インスタンス化機能を強化できます。たとえば、Collections
クラス内のコンストラクターは次のようになります。
// Suppresses default constructor, ensuring non-instantiability.
private Collections() {
}
民間工事では次の2つが保証されます。
(1) 直接新規でインスタンスを作成することはできません。
(2) サブクラスは、親クラスのコンストラクターを明示的または暗黙的に呼び出すことができないため、インスタンス化できません。
もちろん、これは非インスタンス化機能を強化するだけです。実際、インスタンスは引き続きリフレクションまたは逆シリアル化を通じて作成できます。たとえば、インスタンスは次のようにリフレクションを通じて作成されますCollections
。
List<Integer> list = Stream.of(1, 3, 2, 44, 34).collect(Collectors.toList());
Class<Collections> collectionsClass = Collections.class;
Constructor<Collections> constructor = collectionsClass.getDeclaredConstructor(null);
constructor.setAccessible(true);
Collections collections = constructor.newInstance(null);
//warning:Replace "collections" by "Collections"
collections.sort(list);
list.forEach(System.out::println);
list
正しく並べ替えることはできますが、意味がありません。