2012-04-30 4 views
1

私はこのクラスのために、私は2つのオブジェクト(obj1、obj2)を作成しました。これらのオブジェクト以外のオブジェクトを作成したくない場合は、最初に参照する必要があり、クラス、またはのみこれを行う.how(代わりに、1つの以上のオブジェクトを作成する)は、第2のオブジェクトは?コードの下にJavaでのオブジェクトの作成を避けるには?

class B 
{ 
void mymethod() 
    { 
     System.out.println("B class method"); 
      } 
} 
class Myclass extends B 
{ 
public static void main(String s[]) 
    { 
     B obj1=new B();//this is obj1 
     B obj2=new B();//this is obj1 
     B obj3=new B();//don't allow to create this and refer this to obj1 or obj2 
      } 
} 

おかげ アザム

答えて

2

デザインパターンはSingletonです。

B obj1 = B.getInstance(); 
B obj2 = B.getInstance(); 

注:これは、ないスレッドセーフであるだけでこれを行う、あなたのMyclassで、その後

class B 
{ 
    private static B instance = null; 

    private B() 
    { 
     //Do any other initialization here 
    } 

    public static B getInstance() 
    { 
     if (instance == null) 
     { 
      instance = new B(); 
     } 
     return instance; 
    } 
} 

Class Bはそうのようになるはずです。スレッドセーフソリューションをお探しの場合は、Wikiページを参照してください。

EDIT:あなたはまた、一般的に、あなたがシングルトンパターンを必要と言えば、静的初期化子

class B 
{ 
    private static B instance = null; 
    static 
    { 
     instance = new B(); 
    } 


    private B() 
    { 
     //Do any other initialization here 
    } 

    public static B getInstance() 
    {  
     return instance; 
    } 
} 
+0

+1しかし、Bには専用のコンストラクタも必要です。 ;) – weltraumpirat

+0

@weltraumpirat:申し訳ありませんが、私の悪い、あなたは正しいです。今すぐ修正する必要があります。 – npinti

0

を持つことができます。プライベートメソッドになるようにコンストラクタを作成する必要があります。次に、クラスBをインスタンス化するメソッドを作成します。このため、クラスBはこのメソッドでのみインスタンス化できます。シングルトンのパターンを見てみましょう。それは私が信じたいものです。

0

シングルトンを使用できます。それには2つの可能性があります。
1。 レイジー作成(ここでは機能getInstance()を呼び出し、インスタンスが既に存在するかどうかをチェックするときに、インスタンスを作る):

class B { 
    static private B instance; 

    private void mymethod() { 
     System.out.println("B class method"); 
    } 

    static public B getInstance() { 
     if (instance == null) { 
      instance = new B(); 
     } 
     return instance; 
    } 
} 

class Myclass extends B { 
    public static void main(String s[]) { 
     B obj1 = B.getInstance(); // this is obj1 
     B obj2 = B.getInstance(); 


    } 
} 

2。 イーガー作成(クラスが最初に呼び出されたときにここでは、インスタンスを作る):

class B { 
    static private B instance = new B(); 

    private void mymethod() { 
     System.out.println("B class method"); 
    } 

    static public B getInstance() { 
     return instance; 
    } 
} 

class Myclass extends B { 
    public static void main(String s[]) { 
     B obj1 = B.getInstance(); // this is obj1 
     B obj2 = B.getInstance(); 

    } 
} 
0

クラスAの

public Class A { 
    private static Class a = new A(); 

    public A getA() { 
     return a; 
    } 
} 

オブジェクトがすでにクラスAで作成したように、シングルトンクラスを作成します自体。外に作成する必要はありません。 getA()メソッドを使って、クラスAのオブジェクトをretieveするだけです。 Like:

A objA = A.getA(); 

これはSingltonパターンと呼ばれます。

1

うん、それはあなたのここで提供する情報を考慮する正しい方法と思われる。

デフォルトのシングルトンの実装には、次のようになります。

public class Singleton { 
    //holds single instance reference 
    private static Singleton instance = null; 

    //private constructor to avoid clients to call new on it 
    private Singleton() 
    {} 

    public static Singleton getInstance() 
    { 
     if(null == instance) 
     { 
      instance = new Singleton(); 
     } 

     return instance; 
    } 
} 

今、あなたが呼び出すことにより、オブジェクトの単一のインスタンスを取得することができます: シングルトンのインスタンス=シングルトン。getInstance();

スレッド環境で作業する場合、デフォルトではシングルトンはスレッドセーフではありません。

予期しない復帰を避けるために、getInstanceメソッドを同期させる必要があります。単一要素の列挙型と

public synchronized static Singleton getInstance() 
{ 
      if(null == instance) 
      { 
       instance = new Singleton(); 
      } 

      return instance; 
} 

乾杯

2

することができますJavaの6のようシングルトン。この方法は現在、Joshua BlochのEffective Javaによれば、Java 1.6以降でシングルトンを実装する最善の方法です。

package mypackage; 
public enum MyEnumSingleton { 
INSTANCE; 

    // other useful methods here 
} 

"This approach is functionally equivalent to the public field approach, 
except that it is more concise, provides the serialization machinery for free, 
and provides an ironclad guarantee against multiple instantiation, even in the 
face of sophisticated serialization or reflection attacks. While this approach 
has yet to be widely adopted, a single-element enum type is 
the best way to implement a singleton." 

Java 1.6より前では、シングルトンであるべきクラスは次のように定義できます。

public class Singleton { 
private static Singleton uniqInstance; 

private Singleton() { 
} 

public static synchronized Singleton getInstance() { 
    if (uniqInstance == null) { 
     uniqInstance = new Singleton(); 
    } 
    return uniqInstance; 
    } 
    // other useful methods here 
} 
0

シングルトンを使用することは、コードに大きな制限があることに注意してください。複数のオブジェクトをインスタンス化できない場合は、非常に迷惑になることがあります。

特に、ソースへのアクセスがない場合....

+0

例を指摘できますか?たとえば、なぜ「Integer(1)」の2つのインスタンスが必要なのでしょうか? –

+0

少し遅れました。大丈夫整数(1) - すべてのoright。しかしデータベースacessorクラス(たいていは野生の製品に見られる)を作成し、それをシングルトンとして実装することを想像してください。時間が変更され、新しい要件は他のデータベースを統合することです...ソースにアクセスできる場合、リファクタリングが必要です。アクセスがなければ、あなたはそれを素朴にしてしまえばロックインします。それに加えて、列挙型のソリューションは非常に見栄えが良く、ロックをかけません。 – user1363989

関連する問題