2012-01-13 11 views
9

質問はそれをすべて言っています。 シングルトンパターン(そのクラスの最後にある)は解決策です。これを達成する他の方法がありますか?クラスを抽象化すると、インスタンス化できません。それを最終的にすることは継承不可能にします。 両方をどのように組み合わせますか?Javaでインスタンス化不可能で非継承クラスを構築する方法

public final class SingletonObject 
{ 
    private SingletonObject() 
    { 
    // no code req'd 
    } 

    /*public static SingletonObject getSingletonObject() 
    { 
    if (ref == null) 
     // it's ok, we can call this constructor 
     ref = new SingletonObject();   
    return ref; 
    }*/ 

    public Object clone() 
    throws CloneNotSupportedException 
    { 
    throw new CloneNotSupportedException(); 
    // that'll teach 'em 
    } 

    private static SingletonObject ref; 
} 

コード参考:

public final class Useless { 
    private Useless() {} 
} 

プライベートコンストラクタは、通常のオブジェクト指向のソリューションです:http://www.javacoffeebreak.com/articles/designpatterns/index.html

+1

ちょうど '.getSingletonObject()'を定義しないでください... – fge

+0

クラスをインスタンス化することはできませんが、それは役に立たないのですか? – kosa

+4

クラスに静的ユーティリティメソッドしかない場合に便利です。共通のイディオムは、クラスを最終的にすること、および/またはプライベートコンストラクタを定義することです。なぜこれは動作するので、別のイディオムを使うのですか? –

答えて

28

コンストラクタprivateしてください。

Constructor<Useless> con = Useless.class.getDeclaredConstructor(); 
con.setAccessible(true); // bypass "private" 
Useless object = con.newInstance(); 

コンストラクタから例外をスローし、作業からでも反射を防止するために:

public final class Useless { 
    private Useless() { 
     throw new UnsupportedOperationException(); 
    } 
} 
+0

+1:シンプルでストレートフォワード。ありがとう:) 私たちはもっとコードを記述する必要がある場合でも、これを達成するための他の組み合わせはありますか? –

+0

@AshokFelix私は* less *コードを書いています(私の答えを見てください) –

+0

@ PeterLawreyそれが可能かどうかを調べるだけです。議論のために:D –

6

あなたはクラスを意味しかし、まだこのように、リフレクションを使用して、このようなクラスをインスタンス化することは可能であろう静的メソッドのみで?クラスは最終的なものでも抽象的なものでもありません。しかし、プライベートコンストラクタを使用してインスタンス化できないようにすることができます。

final class StaticOnly { 

    private StaticOnly() { 
     throw new RuntimeException("Do not try to instantiate this"); 
    } 

    public static String getSomething() { 
     return "something"; 
    } 
} 

以下の例が有効です。それは抽象的なので、インスタンス化しません。外部のサブクラスからスーパーコンストラクタを呼び出すための方法はありませんので、あなたは

abstract class StaticOnly { 

    private StaticOnly() {} 

    public static String getSomething() { 
     return "something"; 
    } 
} 

列挙型があまりにも

enum StaticOnly { 
    S; 

    public static String getSomething() { 
     return "something"; 
    } 
} 

に動作します(内部のみサブクラスが動作します)それを継承しませんが、それは常に少なくとも一つを持っていますインスタンス(ここではS)。

+3

実際、インスタンスを持たないenumを持つことができます。メンバーを定義する前に – d3dave

3

私は最も簡単なシングルトンパターン

enum Singleton { 
    INSTANCE; 
} 

enumタイプは非インスタンス化可能と非継承され、クラスの初期化は怠け者で、スレッドセーフを使用します。

+0

インスタンスにはインスタンスが1つあります。 Singleton.INSTANCEはそのクラスのインスタンスを取得します。 –

+0

シングルトンは引き続きインターフェイスを実装し、通常のクラスのようなフィールドとメソッドを持つことができます。 –

関連する問題