3

私はJavaプログラミングに不慣れです、私は1つのクラスを持っています、このクラスのために私は2つのオブジェクト(obj1、obj2)を作成しました。 (もう1つのオブジェクトを作成するのではなく)最初または2番目のオブジェクトのみを参照する必要があります。これを行う方法は、以下のコードを参照してください。

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
          } 
 }

ありがとうアザム

4

10 に答える 10

5

Singleton設計パターンを確認してください。

于 2012-04-30T05:58:22.390 に答える
3

必要なのはシングルトンデザインパターンです。

Class B次のようになります。

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;
    }
}

次に、で、Myclassこれを実行します。

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

注:これはスレッドセーフではありません。スレッドセーフなソリューションをお探しの場合は、Wikiページを参照してください。

編集:静的初期化子を使用することもできます

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


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

    public static B getInstance()
    {       
        return instance;
    }
}
于 2012-04-30T06:01:42.267 に答える
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
}
于 2012-04-30T06:07:17.783 に答える
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;
     }
}

これで、次の呼び出しによってオブジェクトの単一インスタンスを取得できます。Singleton instance = Singleton.getInstance();

ただし、スレッド環境で作業している場合、デフォルトではシングルトンはスレッドセーフではないことに注意してください。

予期しない戻りを避けるために、getInstanceメソッドを同期させる必要があります。

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

            return instance;
}

乾杯

于 2012-04-30T06:06:54.607 に答える
0

次のようなシングルトンクラスを作成します

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

    public A getA() {
        return a;
    }
}

クラスAのオブジェクトは、クラスA自体にすでに作成されています。外で作成する必要はありません。getA()メソッドを使用して、クラスAのオブジェクトを取得するだけです。好き :

A  objA = A.getA();

これはシングルトンパターンと呼ばれます。

于 2012-04-30T06:04:37.953 に答える
0

一般的に言えば、シングルトンパターンが必要です。コンストラクターをプライベートメソッドにする必要があります。次に、クラスBをインスタンス化するメソッドを作成します。したがって、クラスBはこのメソッドによってのみインスタンス化できます。シングルトンパターンを見てください。それはあなたが私が信じたいものです。

于 2012-04-30T06:02:18.860 に答える
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();

    }
}
于 2012-04-30T06:02:41.137 に答える
0

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

特に、ソースにアクセスできない場合....

于 2012-04-30T07:49:16.180 に答える