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

GCo*_*Con 18 java inline class instantiation

我从Visual Basic来到Java,似乎认为我曾经在很多方面被宠坏了:p

有没有办法实例化一个对象并内联修改它?就像是:

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

我能够使用@Override方法,但我正在寻找更简单的方法.我有很多搜索,但是如果有这种内联实例化的特定术语,它就会让我失望.

感谢您的时间!

Cli*_*key 33

是的,但有些人认为这很糟糕.

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

基本上你添加了另一层{}(实例初始化块),它在实例化面板时执行.因此你可以在里面放任何代码.(比如打电话给塞特犬).

  • @ SJuan76它被称为"带有初始化程序的匿名类" (3认同)
  • 需要注意的是,如果某些东西正在寻找特定的类,他们将无法获得它,因为这个"技巧"每次使用时都会创建一个匿名类. (2认同)

Kar*_*nek 9

在@ ClickerMonkey的回答中提出了一个很好的技巧.但是,如果类支持方法链接,则可以使用类似的语法而不使用初始化程序"hack":

new ChainClass().setSize(100,100) .setLocation(50,50) .setBackground(Color.red)
Run Code Online (Sandbox Code Playgroud)

缺点是ChainClass看起来必须类似于:

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

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

  // etc.
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,对于大多数标准Java类来说,情况并非如此.您可以为您的课程实现它.

  • 这称为Fluent界面.jQuery使用这种技术. (6认同)
  • 那就是为什么我想在java中使用"this"返回类型. (2认同)