-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 のインスタンス化を...に入れることです。よくわかりません。たぶん、上記は正しくて「OK」ですか?

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 patternを使用しているように見えるため、静的として定義して最初の例のように使用することは理にかなっています。せいぜい Foo.INSTANCE の値は 1 つしか存在しないため、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();
    }
}

mainこのアプローチについて私が聞いた正当な理由は、再利用のために、メソッドを削除するだけで、StaticRefをJavaBeanとして機能するように簡単に変更できるということです。コメントしてください。 同様の解決策については、この回答、またはこの他の回答も参照してください。

于 2013-02-18T08:31:41.843 に答える