ユーティリティ タイプの静的メソッドのコレクションを提供するクラスがあります。
一方では、クラスをインスタンス化できるようにしたくありません。一方で、クラスを継承する必要があるというシグナルを送信したくありません (そうであるとは思いません)。
このクラスを抽象化する必要がありますか?
ユーティリティ タイプの静的メソッドのコレクションを提供するクラスがあります。
一方では、クラスをインスタンス化できるようにしたくありません。一方で、クラスを継承する必要があるというシグナルを送信したくありません (そうであるとは思いません)。
このクラスを抽象化する必要がありますか?
クラスfinal
を作成し、デフォルトのコンストラクターを作成し、コンストラクターprivate
を提供しませんpublic
。そうすれば、誰もそれをサブクラス化したり、インスタンスを作成したりできなくなります。
宣言しないでください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.
}
}
トップレベルのクラスは宣言できませんが、コンストラクターが表示されないためインスタンス化を禁止static
するデフォルトのコンストラクターを宣言することにより、クラスを他のクラスに対してインスタンス化できない (そして実質的に「静的」) にすることができます。private
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をチェックインするため、リフレクションを使用してインスタンスを作成することはできません。
真剣に、あなたは何もする必要はありません。悪いことは何も起こりません。誰もあなたのクラスをインスタンス化/サブクラス化するつもりはありません。
クラスにプライベート コンストラクターを与える他のすべての呼び出しに加えて、それを final にして、何もサブクラス化できないことを明確にする必要があります。
public final class Utils
{
// prevent accidental construction.
private Utils()
{
}
public static void foo()
{
//util code here
}
}
いいえ、ユーティリティ クラスです。インスタンス化を避けるために、デフォルトのコンストラクターを使用する
必要があります。checkstyle を有効にしている場合、有効にしないと警告が表示されます。final
private
クラスに何が含まれているかは、それが抽象であるべきかどうかには関係ありません。要点: 抽象クラスには、それを拡張する別のクラス (「具象」クラス) が必要です。その具象クラスのみをインスタンス化できます。
拡張されないようにするには、 を使用しますfinal
。
インスタンス化されないようにするには、コンストラクターを作成しprivate
ます。
Java では、これらは別個の概念であることに注意してください。