0

私はこのコードを持っています:

public void onPlayerInteract(PlayerInteractEvent event) {
    final Action action = event.getAction();
    if (action == Action.LEFT_CLICK_BLOCK){
        Location l1 = event.getClickedBlock().getLocation();
    } else if (action == Action.RIGHT_CLICK_BLOCK) {
        Location l2 = event.getClickedBlock().getLocation();
    }

    Thread t = new Thread() {
        @Override
        public void run() {
            while(true) {
                try {
                    Thread.sleep(1000*60*60);
                    //Insert code here
                } catch (InterruptedException ie) {
                }
            }
        }
    };
    t.start();

l1からアクセスするにはどうすればよい//insert code hereですか?

4

6 に答える 6

7

l1ブロックの外側で宣言するだけifです。そうでない場合は、そのブロックに対してローカルです。

于 2012-05-25T22:15:08.690 に答える
3

ifブロックの外で宣言しない限り、できません。

現在のコードでは、という名前の変数l1に1行からアクセスできます。

ifブロックの外部で使用する場合は、ifブロック内で定義しないでください。

また、スレッド内で使用する場合は、変数をfinalとして宣言する必要があります。

于 2012-05-25T22:15:26.603 に答える
3

あなたが扱っている実際には2つの問題があります:

  1. 変数l1はifブロックの外に移動する必要があります(したがってl1、使用するポイントでスコープ外にならないようにします)。
  2. l1最終的でなければなりません。変数は内部クラスインスタンスにコピーする必要があるため、内部クラスは非最終変数を使用しません。
于 2012-05-25T22:17:54.963 に答える
2

私は通常、ベストプラクティス(特にIFブロックの外部で変数を使用する場合)に固執し、メソッドの先頭で変数を宣言します。

またはこのようなことをしてください...

Location loc; 
if (action == Action.LEFT_CLICK_BLOCK){
    loc = event.getClickedBlock().getLocation();
} else if (action == Action.RIGHT_CLICK_BLOCK) {
    loc = event.getClickedBlock().getLocation();
}
于 2012-05-25T22:16:39.087 に答える
1

何かが足りないかもしれませんが、両方の場合に同じメソッド呼び出しチェーンを使用するのに、なぜ条件付きブロックを使用しているのですか?

次のようにコードを変更します。

public void onPlayerInteract(PlayerInteractEvent event) {
    final Location l = event.getClickedBlock().getLocation();

    Thread t = new Thread() {
        @Override
        public void run() {
            while(true) {
                try {
                    Thread.sleep(1000*60*60);
                    //Insert code here
                } catch (InterruptedException ie) {
                }
            }
        }
    };
    t.start();

または、他にもある場合-条件が次のようにロケーションを使用する必要がある場合:

public void onPlayerInteract(PlayerInteractEvent event) {
    final Action action = event.getAction();
    final Location l = null;

    if (action == Action.LEFT_CLICK_BLOCK){
        l = event.getClickedBlock().getLocation();
    } else if (action == Action.RIGHT_CLICK_BLOCK) {
        l = event.getClickedBlock().getLocation();
    }

    Thread t = new Thread() {
        @Override
        public void run() {
            while(true) {
                try {
                    Thread.sleep(1000*60*60);
                    //Insert code here
                } catch (InterruptedException ie) {
                }
            }
        }
    };
    t.start();

しかし、もう一度...多分私は何かが欠けています。

于 2012-05-25T22:22:29.360 に答える
0

あなたは、vriablesが作成されたコープで一般的に利用可能であることを理解する必要があります。ただし、通常、そのスコープを持つ任意のスコープに設定できます。

だからこれを試してみてください

public void onPlayerInteract(PlayerInteractEvent event) { 

    final Action action = event.getAction(); 
    Location l1; // Created at function scope
    Location l2;  
    if (action == Action.LEFT_CLICK_BLOCK){ 
         l1 = event.getClickedBlock().getLocation();  // l1 available here
    } else if (action == Action.RIGHT_CLICK_BLOCK) { 
         l2 = event.getClickedBlock().getLocation();  // l1 available here
    } 


    and l1 & l2 available here and below
    .
    .
    .

} // l1 & l2 go out of scrope here.

また、左クリックまたは右クリックで1つだけが設定されるため、l1とl2の両方が必要になることはないことを考慮する必要があります。

于 2012-05-25T22:19:24.273 に答える