web-dev-qa-db-ja.com

Java)でのインラインオブジェクトのインスタンス化と変換

VisualBasicからJavaに来ましたが、多くの点で甘やかされていると思います:p

オブジェクトをインスタンス化してインラインで変更する方法はありますか?何かのようなもの:

JFrame aFrame = new JFrame();   
aFrame.add(new JPanel() {.setSize(100,100) .setLocation(50,50) .setBackground(Color.red) });

私は@Overrideメソッドですが、もっと簡単なものを探しています。私はたくさん検索していますが、この種のインラインインスタンス化に特定の用語があると、それは私にはわかりません。

お時間をいただきありがとうございます!

19
GCon

はい、しかし一部の人々はそれをハッキーだと考えています。

JFrame aFrame = new JFrame();
aFrame.add(new JPanel() {{
 setSize(100,100);
 setLocation(50,50);
 setBackground(Color.red);
}});

基本的に、{}(インスタンス初期化ブロック)の別のレイヤーを追加します。これは、パネルがインスタンス化されたときに実行されます。したがって、任意のコードを含めることができます。 (セッターを呼び出すように)。

31
ClickerMonkey

@ClickerMonkeyの回答には、すばらしいトリックが示されています。ただし、クラスがメソッドチェーンをサポートしている場合は、初期化子の「ハック」なしで同様の構文を使用できます。

new ChainClass().setSize(100,100) .setLocation(50,50) .setBackground(Color.red)

欠点は、ChainClassが次のように見える必要があることです。

public class ChainClass  {
  public ChainClass setSize(int w, int h)  {
     // ...
     return this;
  }

  public ChainClass setLocation(int x, int y)  {
    // ...
    return this;
  }

  // etc.
}

残念ながら、これはほとんどの標準的なJavaクラスには当てはまりません。ただし、クラスに実装することはできます。

9
Karel Petranek