Java 中的内联对象实例化和转换

问题描述 投票:0回答:2

我从 Visual Basic 转向 Java,似乎认为我在很多方面都被宠坏了 :p

有没有办法实例化一个对象并内联修改它?比如:

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

我能够使用

@Override
方法,但我正在寻找更简单的方法。我搜索了很多,但如果有一个特定的术语来描述这种内联实例化,我却找不到。

感谢您的宝贵时间!

java class inline instantiation
2个回答
47
投票

是的,但有些人认为它很hacky:

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

基本上,您添加了另一层

{}
(实例初始化块),该层在实例化面板时执行。因此您可以在其中放入任何代码。 (就像调用 setter 一样)。


12
投票

@ClickerMonkey 的回答中提出了一个很好的技巧。但是,如果类支持方法链,您可以使用类似的语法,而无需初始化程序“hack”:

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 类的情况并非如此。不过,您可以在您的课程中实现它。

© www.soinside.com 2019 - 2024. All rights reserved.