-1

以某种方式将方法或匿名内部类放入驱动程序类的主要方法中有一个特殊的习惯用法:

package net.bounceme.dur.misc;

import net.bounceme.dur.misc.Foo;

public class StaticRef {

    Foo f = Foo.INSTANCE;

    public static void main(String[] args) throws Exception {

        f.connect();  //move this to inside "run"
        /*
        public void run(){
           StaticRef sf = new StaticRef();
           //do stuff here
        }
         */
    }
}

以防止出现以下错误:

init:
Deleting: /home/thufir/NetBeansProjects/nntp/build/built-jar.properties
deps-jar:
Updating property file: /home/thufir/NetBeansProjects/nntp/build/built-jar.properties
Compiling 1 source file to /home/thufir/NetBeansProjects/nntp/build/classes
/home/thufir/NetBeansProjects/nntp/src/net/bounceme/dur/misc/StaticRef.java:11: non-static variable f cannot be referenced from a static context
        f.connect();  //move this to inside "run"
1 error
/home/thufir/NetBeansProjects/nntp/nbproject/build-impl.xml:626: The following error occurred while executing this line:
/home/thufir/NetBeansProjects/nntp/nbproject/build-impl.xml:245: Compile failed; see the compiler error output for details.
BUILD FAILED (total time: 0 seconds)

但是,到目前为止我找不到任何东西。我在线程示例中看到类似的东西,但不能完全理解语法。

以下主要是我想要的,但我认为它不太正确:

package net.bounceme.dur.misc;

public class StaticRef {

    Foo f = Foo.INSTANCE;

    public static void main(String[] args) throws Exception {

        StaticRef sf = new StaticRef();
        sf.f.connect();
    }
}

我想要的是将 sf 的实例化放入......我不太确定。也许以上是正确的和“好的”?

4

4 回答 4

1

你有一些选择:

  • 进入Foo范围main
  • 声明Foo为静态变量

    static Foo f = Foo.INSTANCE;
    
  • 创建一个实例StaticRef并使用该对象

    new StaticRef().f.connect();
    
于 2013-02-18T07:23:47.373 回答
1

您的实例变量无法从静态上下文中引用。你需要一个类的对象来获取(引用)它的内容。

你可以写一个单例模式:

public class SingletonDemo {
    private static SingletonDemo instance = null;

    private SingletonDemo() {       }

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

}

如果线程安全是一个问题,您可以使用枚举:

public enum Singleton{
    INSTANCE;
    private Singleton(){ ... }
}

或者

public class Singleton{
    private final static Singleton instance = new Singleton();
    private Singleton(){ ... }
    public static Singleton getInstance(){ return instance; }
}

这里

于 2013-02-18T07:25:26.590 回答
1

抱歉,还不能发表评论,所以我必须将其发布为答案。

更新后的代码很好,但由于 Foo.INSTANCE 似乎是对Singleton 模式的使用,因此将其定义为 static 并像在第一个示例中一样使用它是有意义的。最多只有一个 Foo.INSTANCE 值,因此让每个 StaticRef 实例都有自己对 Foo.INSTANCE 的引用是没有意义的。

于 2013-02-18T07:25:40.377 回答
0

如果此代码“错误”或违反任何 OOP 原则,请发表评论:

package net.bounceme.dur.misc;

public class StaticRef {

    private Foo f = Foo.INSTANCE;

    public StaticRef() throws Exception {
        f.connect();
    }

    public static void main(String[] args) throws Exception {
        new StaticRef();
    }
}

我听说这种方法的理由是,为了重用,StaticRef 可以很容易地修改为充当 Java Bean,只需删除该main方法。请发表评论。 另请参阅此答案,以获取类似的解决方案,或此其他答案

于 2013-02-18T08:31:41.843 回答