「Effective Java」の第 4 条では、プライベート コンストラクトを介してインスタンスを作成しない機能を強化しています。

この記事は主にjava.lang.Math、 、java.util.Arraysjava.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正しく並べ替えることはできますが、意味がありません。

おすすめ

転載: blog.csdn.net/baidu_40120883/article/details/131882398