3

私はJavaを初めて使用し、数日から基本的なコーディングを行っています。今日、変数と内部クラスを処理しているときに、内部クラスで非最終変数を使用しているときに行き詰まりました。

私は自分の仕事にtestNGフレームワークを使用しているので、これが私が試しているシナリオです。

=========

public class Dummy extends TestNG {
   @Override
   public void setUp() throws Exception {
      log.error("Setup Goes here");
   }

   @Override
   public void test() throws Exception {
        String someString = null;
        try { 
         someString = "This is some string";
      } catch (Exception e) {
         log.error(e.getMessage());
      }
         Thread executeCommand = new Thread(new Runnable() {
            @Override 
            public void run() {       
               try {
                  runComeCommand(someString, false); <=====ERROR LINE
               } catch (Exception e) {
                  log.error(e.getMessage());
               }
            }
         });
   }

   @Override
   public void cleanUp() throws Exception {
   }
}

==========

上記のコードを書いたとき、「内部クラスの非最終変数を参照できません」というエラーがスローされました。そこで、eclipsが提供する提案の1つ、つまり親クラスでsomeString変数を宣言することを実装しました。これで、コードは次のようになります。

==========

public class Dummy extends TestNG {
   String someString = null; <=====Moved this variable from test() to here
   @Override
   public void setUp() throws Exception {
        log.error("Setup Goes here");
   }
   @Override
   public void test() throws Exception {
                <same code goes here>
   }

   @Override
   public void cleanUp() throws Exception {
   }
}

==========

これで、日食にエラーは表示されません。私は知りたいのですが、なぜそれが最終的ではないのに内部クラスの変数を受け入れるのか。同じエラーで失敗するべきではありませんか?これは今機能しますか?どんな助けでも素晴らしいでしょう。

4

3 に答える 3

3

最初の例someStringでは、のローカル変数ですtest。内部クラスはその値の変更を監視できないため、非最終ローカル変数を参照することはできません。その変数をとして宣言することによりfinal、追加の参照が内部クラスに保持されます(そして、その変数の値は、インスタンスが作成されたときにすでにわかっています)。

2番目の例では、ローカル変数someStringではなくインスタンス変数です。内部クラスは、コンテナオブジェクトからその変数を参照できます。

于 2013-03-18T14:44:21.960 に答える
2

2番目のケースでは、変数は、その存続期間がその包含オブジェクトと同じであるフィールドです。

最初のケースでは、変数はメソッドに対してローカルです。その存続期間は、メソッドで作成された匿名クラスインスタンスよりも短い場合があります。匿名クラスインスタンスを作成するときに、その値のコピーが必要です。

于 2013-03-18T14:44:12.487 に答える
0

これまで見てきたように、Javaコンパイラは、内部クラスで最終的ではない一時変数を参照させません。Eclipseが作成を提案したクラス変数を参照できます。これはJavaの仕様によるものです。実際には、一時変数ではなく、内部クラスでこのクラス変数を参照しています。

ここで最終変数と内部クラスを確認することをお勧めします

于 2013-03-18T14:45:32.287 に答える