【问题标题】:Inline object instantiation and transformation in JavaJava中的内联对象实例化和转换
【发布时间】:2012-01-06 21:49:55
【问题描述】:

我是从 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


    【解决方案1】:

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

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

    基本上你再添加一层{}(实例初始化块),在面板实例化时执行。因此您可以将任何代码放入其中。 (比如调用 setter)。

    【讨论】:

    • 这种技术叫什么?我想了解更多。
    • @SJuan76 它被称为“带有初始化程序的匿名类”
    • 他在匿名类中使用实例初始化块,并调用它的继承方法如this.setSize...
    • 先生!你是神!我知道它一定存在,但我永远无法想象使用另一副牙套!至于“带有初始化程序的匿名类”,做梦也想不到:p 再次感谢!
    • 需要注意的是,如果某些东西正在寻找特定的类,他们不会得到它,因为这个“技巧”在每次使用时都会创建一个匿名类。
    【解决方案2】:

    @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 类并非如此。你可以为你的类实现它。

    【讨论】:

    • 这被称为 Fluent 接口。 jQuery 使用了这种技术。
    • 这就是为什么我想要在 java 中使用“this”返回类型。
    • 特别是因为泛型类......当你有子类时,方法链对泛型来说很烦人。
    猜你喜欢
    • 2012-01-20
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多