你能一次在一个对象上调用几个方法吗?

时间:2012-01-07 16:06:43

标签: java c++ oop syntax

只是一个小问题我也无法在谷歌搜索答案。

是否可以做类似的事情。

bomb.setX(newx)
     .setY(newy);

炸弹只是一个方法setX和setY的对象,我只是想知道你是否可以将方法调用串联在一起以节省空间并使事物更具人性化?我确定我之前见过类似的事情......

哦,我在这里工作java。虽然我有兴趣知道如果有人知道,c ++中是否存在这样的简写:)

8 个答案:

答案 0 :(得分:6)

如果setX返回炸弹,是的。

public Bomb setX(Object x){
    this.x = x;
    return this;
}

调用此流畅的界面。为了实现这种流畅的界面,它使用了一种称为方法链接的技术。

在软件工程中,一个流畅的界面(由Eric Evans和Martin Fowler创造的第一个)是面向对象API的实现,旨在提供更易读的代码。 通常通过使用方法链接来中继后续调用的指令上下文来实现流畅的接口(但是流畅的接口不仅仅需要方法链接)。 [1]

答案 1 :(得分:2)

这不是同时调用多个方法,而是进行方法链接。

通常,这是可能的,因为这些方法返回this

// class X
public X setX(int val)
{
    x = val;
    return this;
}

等等。

答案 2 :(得分:2)

为了使这种语法有效,setX必须返回它运行的对象。这是相当普遍的。在C ++中,您返回对自身的引用 - 请参阅C ++流示例。

Bomb& Bomb::setX(X& newX) {
    x = newX;
    return *this;
}

答案 3 :(得分:2)

据我所知,您正在讨论链接调用(当所有void方法都返回此时)。这个功能建议在Java 7中使用,但据我所知,我拒绝了。因此,今天没有用于链接java调用的内置机制。看Builder design pattern,它非常接近但是只为只读类设计。

此外,您始终可以自己实施Fluent interface

答案 4 :(得分:1)

当然可以,但为了做到这一点,每个setter都需要返回this,这对setter来说不太好,因为框架将无法再找到它们。例如,标准java.beans.Introspector会忽略非void setter:

public class Chain {
    private int i;

    public int getI() {
        return i;
    }

    public Chain setI(int i) {
        this.i = i;
        return this;
    }

    public static void main(String[] args) throws IntrospectionException {
        PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(Chain.class).getPropertyDescriptors();
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            System.out.println("property = " + propertyDescriptor.getDisplayName());
            System.out.println("read = " + propertyDescriptor.getReadMethod());
            System.out.println("write = " + propertyDescriptor.getWriteMethod());
        }
    }
}

打印

property = class
read = public final native java.lang.Class java.lang.Object.getClass()
write = null
property = i
read = public int org.acm.afilippov.Chain.getI()
write = null

鉴于Apache BeanUtils使用它,很可能许多Apache框架将决定该属性是只读的。

答案 5 :(得分:1)

更多,更不用了。

如果Bomb.setX()返回自己的实例,它将起作用。

class Bomb{

    ...

   Bomb setX(int value) {
      this.x = value;
      return this;
   }

}

完整主题称为fluent interface

但不幸的是,大多数Java Libs,据我所知,complate核心,不遵循这个想法。更糟糕的是,Java-Bean规范(定义变量,getter和setter之间关系的东西)不是基于这个原则。因此,如果你有一个需要Java-Beans的框架,那么它可能会也可能不适用于那样的类。

答案 6 :(得分:1)

如果方法正确定义 - 那么是的!实际上你要找的是fluent interface。流畅的界面的主要目标是方法链。例如,builders以这种方式实现,你得到:

new SomethingBuilder().withX(x).withY(y).build();

你只需要在setX和setY中返回(例如)“this”。

答案 7 :(得分:0)

如果setX和setY返回炸弹对象,则可以。这允许您链接方法,这被称为Fluent Interface。您可以在这里查看Java中的示例:

http://hilloldebnath.byethost3.com/2009/08/20/implementing-the-fluent-interface-approach-in-java/