【问题标题】:Anonymous Objects in JavaJava 中的匿名对象
【发布时间】:2014-07-23 17:03:06
【问题描述】:

Java 帮助我们使用创建匿名对象

new class_name();

声明并使用关联(。)运算符调用方法

new Emp().input();

如何使用它同时从匿名对象调用两个方法,例如同时调用 input()show()

【问题讨论】:

  • 你不能。因为对象没有被引用,一旦方法返回,基本上就丢失了。有些api使用了fluent interface模式,但还是比较少见的。
  • 您需要致电Emp e = new Emp(); e.input(); e.show();。为什么这不是一个可接受的解决方案,顺便说一句?
  • @njzk2 如果您将其分配给名称,则不是真正的anonymous ;)
  • @aruisdante:完全正确。我的评论应该改写:why do you need the object to be anonymous?
  • 作为一般建议,我会告诫不要试图让您的代码过于简洁。流畅的模式很好,但另一方面,把它写成三行也是如此。有些台词同时做了无数的事情,我看过并想,“如果我们把它们分开会更易读”——但我看到的情况非常 3 或 4 行,然后想,“如果我们将它们压缩成一行,这将更具可读性。”

标签: java


【解决方案1】:

public Emp show() {
    // do the stuff
    return this;
}
public Emp input() {
    // do the stuff
    return this;
}

然后调用

new Emp().show().input();

【讨论】:

  • 那就是@njzk2 提到的fluent interface pattern
  • 别忘了用返回类型替换 void :-)
  • voids 应该是 Emp。 :)
  • 感谢保罗和罗迪的修复
【解决方案2】:

制作一个方法怎么样:

public void inputThenShow() {
    input();
    show();
}

然后调用

new Emp().inputThenShow();

【讨论】:

  • 方法 ShowAndInput() 应该是 showAndInput() 驼峰式大小写,首字母小写,以遵循 Java 编码风格 + 约定。另外,就我个人而言,我希望将该方法称为 inputThenShow() 或类似名称,以指示执行操作的顺序。
  • 这应该是一个例外而不是常态。一般来说,在方法名称中包含 and 这个词是非常糟糕的。
  • 为什么不好?并且方法名中没有and
  • @Zach 原来的版本有。但我认为skiwi 所引用的是一种具有single responsibility 的方法的想法,这是一种常见的、通常被认为是“好”的OO 实践。与其说是“和”这个词本身,不如说是它所暗示的违反原则(至少我认为这就是skiwi的意思)。
【解决方案3】:

您还可以在不修改 Emp 类的情况下创建一个匿名类来扩展您的类以允许它调用这两种方法。

new Emp() {
    public void doStuff() {
        input();
        show();
    }
}.doStuff();

作为奖励,它为您提供了一个匿名类的匿名实例。

【讨论】:

  • 除非它(这里:Emp)是最终类
猜你喜欢
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多