0

我正在尝试为 System 类实现单例模式。我发现的示例无法编译(例如http://www.tutorialspoint.com/java/java_using_singleton.htm)。非静态类中有一个静态方法。所以我将类设为静态,一切都很好,直到我尝试为我的 Timer 类创建一个成员变量。

现在我收到消息“无法访问 Scene_3d 类型的封闭实例。必须使用封闭实例来限定分配......

我四处搜索,但没有人为我编译单例模式。顺便说一句,我正在使用处理(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

定时器在 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;
  }
}

您还缺少这两种方法的公共限定符。

于 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 回答
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用于单例。来自 “有效的 Java”

“这种方法在功能上等同于公共领域方法,只是它更简洁,免费提供序列化机制,并提供针对多次实例化的铁定保证,即使面对复杂的序列化或反射攻击。虽然这种方法有尚未被广泛采用,单元素枚举类型是实现单例的最佳方式。

所以使用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. 首先顶级类不能声明为静态的。

  2. 您创建的公共方法( public static DemoSystem Inst() )不能保证它只会在并发的情况下创建单例对象。为此,仅在声明时初始化对象,例如: private static DemoSystem instance = new DemoSystem();

或正确同步方法。

  1. 制作 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 回答