1

嗨我想在处理中添加一个单点模式

public class Singleton {

    private static final Singleton instance = new Singleton();

    private Singleton() {
    }

    static Singleton getInstance(){
        return instance;
    }

}

错误:字段实例不能声明为静态;静态字段只能在静态或顶级类型中声明

谢谢汉斯

4

5 回答 5

1

看来你Singleton是一个内部阶级。从JLS

内部类是没有显式或隐式声明为静态的嵌套类。

内部类包括本地(§14.3)、匿名(§15.9.5)和非静态成员类(§8.5)。

内部类不能声明静态初始化器(第 8.7 节)或成员接口,否则会发生编译时错误。

内部类不能声明静态成员,除非它们是常量变量(第 4.12.4 节),或者发生编译时错误。

规范说内部类只能声明编译时常量字段,而private static final Singleton instance = new Singleton();不是编译时常量。

于 2013-06-27T09:43:09.970 回答
1

尽管您无法分辨,但无论您添加多少选项卡,处理草图都是一个 Java 顶级类。这些选项卡只是用来帮助您组织代码,但它们仍然属于一个类。无论你的草图被称为什么,这个类都被称为,并在处理的核心中扩展了 PApplet 类。您在草图中定义的任何类都将成为顶级类(内部类)的一部分,并且由于编译器不允许您设置静态内部类,因此您永远无法实际创建它。

一般来说,我不明白为什么有人想在处理中添加单例模式。其背后的原因是除了模式中定义的单个对象之外,不允许从该类中生成对象。这种行为主要在设计 API 时很有用,或者当你有这么大的程序需要跟踪什么在哪里产生时。单例模式在那里很有用,因为在某种程度上,它限制了每个顶级类可以对另一个顶级类执行的操作。单例模式背后的另一个原因是允许全局字段和方法(可以在所有程序中使用)。由于处理草图本质上是一个单独的 java 类,因此您已经拥有此功能,并且可以在程序的任何位置设置方法或字段。

这些是您在处理过程中不会做的事情,但可能是在一个不限制您的完整 Java 环境中,例如 eclipse。处理背后的想法是让事情尽可能简单,从而以各种方式限制你,这就是为什么我喜欢它来速写!当您的程序变得庞大/复杂时,您最好切换到另一个 IDE。

但是,如果您愿意,您可以继续向我们提供您选择此模式的理由,然后有人可以用最好的方式回答!

于 2013-07-13T13:13:34.953 回答
1

您必须创建一个新选项卡并将其命名为Singleton.java。使用 Processing IDE 时,每个使用静态变量的类都需要放在一个 java 文件中。

于 2013-06-27T09:49:02.920 回答
1

尝试这个

公共类单例{私有静态最终单例实例;

private Singleton() {}

 public static Singleton getInstance() 
 {
    if(instance != null)
      return instance;
    else
         {
            instance = new Singleton();
         }
 }
}
于 2013-06-27T09:53:25.780 回答
0

如果您的 Singleton 是一个内部类,则应将其声明为 static 以便能够在其中包含静态成员

public static class Singleton {
   ...
于 2013-06-27T09:57:52.703 回答