0

だから私はプログラミングを始めて数年なので、それほど新しいわけではありませんが、Java (C++ から) を学び始めたばかりです。ライブラリを学習し、その例 (知っておく必要がある場合は jMonkeyEngine3) を調べているときに、ドキュメントが見つからないように見える外国の構文に出くわしました。

コードは次のとおりです (すべてがクラスのスコープ内にあります)。

/** Custom Keybinding: Map named actions to inputs. */
private void initKeys() {
  // You can map one or several inputs to one named action
  inputManager.addMapping("Pause",  new KeyTrigger(KeyInput.KEY_P));
  inputManager.addMapping("Left",   new KeyTrigger(KeyInput.KEY_J));
  inputManager.addMapping("Right",  new KeyTrigger(KeyInput.KEY_K));
  inputManager.addMapping("Rotate", new KeyTrigger(KeyInput.KEY_SPACE),
                                    new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
  // Add the names to the action listener.
  inputManager.addListener(actionListener, new String[]{"Pause"});
  inputManager.addListener(analogListener, new String[]{"Left", "Right", "Rotate"});

}

private ActionListener actionListener = new ActionListener() {
  public void onAction(String name, boolean keyPressed, float tpf) {
    if (name.equals("Pause") && !keyPressed) {
      isRunning = !isRunning;
    }
  }
};

定義部分 (15) は、クラス内のデフォルト コンストラクターを使用して、actionListener という名前のプライベート スコープを持つ ActionListener のオブジェクトを作成し、onAction メソッド自体をオーバーライド/実装すると推測しています。次に、その実装 (11) では、この作成されたオブジェクトを参照しているだけですか? それは正しいでしょうか?

明確にしていただきありがとうございます。

4

1 に答える 1

2

定義部分 (15) が ActionListener のオブジェクトを作成すると推測しています

その構文は、匿名内部クラスとして知られているものです。JDK 8 が登場するまでは、Java のクロージャーまたはラムダ式に到達できる限り近いものです。基本的に、その場で新しいクラスを作成しています。それは事実上、あなたが言ったのと同じです:

private ActionListener actionListener = new MyActionListener();

class MyActionListener implements ActionListener {
    public void onAction(String name, boolean keyPressed, float tpf) {
        if (name.equals("Pause") && !keyPressed) {
            isRunning = !isRunning;
        }
    }
}

もう1つの方法は、使用する行数を減らすだけです。

プライベートスコープで

オブジェクトがプライベートであるというわけではありません。Private は、オブジェクトへの参照を保持するフィールドの可視性です。オブジェクト自体は、他のオブジェクトと同様に、どこにでも渡すことができます。

名前付きアクションリスナー

これは、作成された ActionListener への参照を保持するフィールドの名前です。

クラス内でデフォルトのコンストラクターを使用する

実際、ActionListener はインターフェースであるため、コンストラクターはありません。匿名の内部クラスでさえ、技術的にはデフォルトのコンストラクターを持っていません。代わりに、「匿名コンストラクター」があります。

于 2013-02-14T06:26:19.143 に答える