9

ユーティリティ タイプの静的メソッドのコレクションを提供するクラスがあります。

一方では、クラスをインスタンス化できるようにしたくありません。一方で、クラスを継承する必要があるというシグナルを送信したくありません (そうであるとは思いません)。

このクラスを抽象化する必要がありますか?

4

8 に答える 8

13

クラスfinalを作成し、デフォルトのコンストラクターを作成し、コンストラクターprivateを提供しませんpublic。そうすれば、誰もそれをサブクラス化したり、インスタンスを作成したりできなくなります。

于 2013-02-15T00:35:25.323 に答える
8

宣言しないでくださいabstract。コンストラクターを宣言してprivate、誰も、サブクラスでさえ、ユーティリティ クラスのインスタンスをインスタンス化できないようにします。

クラスを宣言することはできますfinalが、すべてのコンストラクターがprivateである場合は、とにかく誰もそれをサブクラス化できません。

別の回答で Pshemo のコメントからアイデアを借りるには、コンストラクターで RuntimeException をスローして、 AccessibleObjectsetAccessibleのリフレクションのメソッドがインスタンス化を許可しないようにします。

public class MyUtility
{
   private MyUtility()
   {
      throw new RuntimeException("Instantiation of MyUtility is not allowed!");
   }

   public static void utilityMethod()
   {
      // Your utility method here.
   }
}
于 2013-02-15T00:35:23.950 に答える
3

トップレベルのクラスは宣言できませんが、コンストラクターが表示されないためインスタンス化を禁止staticするデフォルトのコンストラクターを宣言することにより、クラスを他のクラスに対してインスタンス化できない (そして実質的に「静的」) にすることができます。private

于 2013-02-15T00:36:27.363 に答える
2

@mreの 答えの別のバージョン

enum MyClass{
    ;//this semicolon indicates that this enum will have no instances

    //now you can put your methods
    public static void myMethod(){
        //...
    }
}

デフォルトでは列挙型はfinalであり、そのコンストラクターはプライベートです。また、Enumオブジェクトをインスタンス化しようとしている場合は、 Constructor#newInstanceをチェックインするため、リフレクションを使用してインスタンスを作成することはできません。

于 2013-02-15T01:08:23.623 に答える
1

真剣に、あなたは何もする必要はありません。悪いことは何も起こりません。誰もあなたのクラスをインスタンス化/サブクラス化するつもりはありません。

于 2013-02-15T00:49:43.373 に答える
1

クラスにプライベート コンストラクターを与える他のすべての呼び出しに加えて、それを final にして、何もサブクラス化できないことを明確にする必要があります。

public final class Utils
{
    // prevent accidental construction.
    private Utils() 
    {  
    } 

    public static void foo()
    { 
        //util code here
    }
}
于 2013-02-15T00:38:35.893 に答える
1

いいえ、ユーティリティ クラスです。インスタンス化を避けるために、デフォルトのコンストラクターを使用する
必要があります。checkstyle を有効にしている場合、有効にしないと警告が表示されます。finalprivate

于 2013-02-15T00:35:59.127 に答える
1

クラスに何が含まれているかは、それが抽象であるべきかどうかには関係ありません。要点: 抽象クラスに、それを拡張する別のクラス (「具象」クラス) が必要です。その具象クラスのみをインスタンス化できます。

拡張されないようにするには、 を使用しますfinal

インスタンス化されないようにするには、コンストラクターを作成しprivateます。

Java では、これらは別個の概念であることに注意してください。

于 2013-02-15T00:35:49.130 に答える