0

System クラスのシングルトン パターンを実装しようとしています。私が見つけた例はコンパイルされません (例: http://www.tutorialspoint.com/java/java_using_singleton.htm )。非静的クラスに静的メソッドがあります。そのため、クラスを静的にしましたが、Timer クラスのメンバー変数を作成しようとするまではすべて問題ありませんでした。

「Scene_3d 型の囲んでいるインスタンスにアクセスできません。囲んでいるインスタンスで割り当てを修飾する必要があります...

私は周りを検索しましたが、誰もシングルトンパターンをコンパイルしてくれません。ところで、私は Processing (Java IDE/拡張機能) を使用しています。これを修正する方法についてのアイデアは非常に役立ちます。ありがとう!

static public class DemoSystem {
  private static DemoSystem instance = null;  
  protected DemoSystem() {}

  public static DemoSystem Inst() {
    if( instance == null ) {
      instance = new DemoSystem();
    }
    return instance;
  }

  void init() {
    Timer timer = new Timer();  
  }

  int getTime() {
    return timer.elapsedTime;
  }
}
4

5 に答える 5

2

標準的なシングルトン パターンは、privateコンストラクターと静的インスタンス変数を持つことです。

public class DemoSystem {
  private static DemoSystem instance = null;
  private Timer timer;
  protected DemoSystem() {}

  public static DemoSystem Inst() {
    if( instance == null ) {
      instance = new DemoSystem();
    }
    return instance;
  }

  void init() {
    timer = new Timer();  
  }

  int getTime() {
    return timer.elapsedTime;
  }
}

インポートを修正すると、これは正常に機能するはずです。

于 2013-02-13T06:26:35.840 に答える
1

まず第一に、トップレベルのクラスは静的にすることはできないと思います。最初はネストされたクラスがなく、どのクラスにも静的を追加できませんでした。

したがって、以下は無効です

static public class DemoSystem {

 ...
}

あなたが変えなければならないのは好きです

public class DemoSystem {
  private static DemoSystem instance = null;
  private Timer timer;
  protected DemoSystem() {}

  public static DemoSystem Inst() {
    if( instance == null ) {
      instance = new DemoSystem();
    }
    return instance;
  }

  void init() {
    timer = new Timer();  
  }

  int getTime() {
    return timer.elapsedTime;
  }
 }

Enumシングルトンに使用する方が良いです。「 EffectiveJava」より

「このアプローチは、より簡潔で、無料のシリアル化機構を提供し、高度なシリアル化またはリフレクション攻撃に直面した場合でも、複数のインスタンス化に対する強力な保証を提供することを除いて、パブリックフィールドアプローチと機能的に同等です。まだ広く採用されていないので、シングルエレメント列挙型はシングルトンを実装するための最良の方法です。

したがってEnum、クラスの使用は次のようになります。

public enum DemoSystem {
    INSTANCE;
    private Timer timer;
    void init() {
       timer = new Timer();  
     }

    int getTime() {
       return timer.elapsedTime;
    }
}
于 2013-02-13T06:32:17.923 に答える
1

投稿されたオリジンコードスニペットに関連するいくつかのポイントがあります。

  1. まず、最上位クラスを static として宣言することはできません。

  2. 作成した public メソッド ( public static DemoSystem Inst() ) は、同時実行の場合にのみシングルトン オブジェクトを作成するという保証はありません。そのためには、次のように宣言時にオブジェクトを初期化します。 private static DemoSystem instance = new DemoSystem();

またはメソッドを適切に同期します。

  1. クラス レベルの変数である Timer timer を作成します。

  2. timer.elapsedTime とは何ですか。Timer クラスにそのようなプロパティはないと思います。別の api を使用している場合は、必要なインポートを行います。

したがって、最終的なコードは次のようになります。

import java.util.Timer;

public class DemoSystem {
    // Declared the variable at class level.
    Timer timer = null;

    // Initializing the object here only.
    private static DemoSystem instance = new DemoSystem();

    // Made the constructer private.
    private DemoSystem() {
    }

    // Static method to get singleton instance
    public static DemoSystem Inst() {
        return instance;
    }

    void init() {
        timer = new Timer();
    }

    int getTime() {
        //commented the statement so to compile the class  
        //return timer.elapsedTime;
        return 1;
    }
}
于 2013-02-13T11:45:46.927 に答える
1

timer は init 内で宣言されています。get メソッドがアクセスできるように、クラスで起動する必要があります。たとえば、次のようになります。

static public class DemoSystem {
  private static DemoSystem instance = null;
  private Timer timer;
  protected DemoSystem() {}

  public static DemoSystem Inst() {
    if( instance == null ) {
      instance = new DemoSystem();
    }
    return instance;
  }

  public void init() {
    timer = new Timer();  
  }

  public int getTime() {
    return timer.elapsedTime;
  }
}

また、2 つのメソッドでパブリック修飾子が欠落していました。

于 2013-02-13T06:24:48.497 に答える
1

クラス全体を静的として宣言することはできないと思います:

static public class DemoSystem {

次のようにする必要があります。

public class DemoSystem {

また、100% ではなく、構文エラーがある可能性があります (セミコロンがありません...):

   protected DemoSystem() {}

する必要があります

   protected DemoSystem() {};
于 2013-02-13T06:26:22.810 に答える