你能同时对一个对象调用几个方法吗

Can you invoke several methods on an object at once?

本文关键字:几个 方法 调用 一个对象      更新时间:2023-10-16

只是一个小问题,我在谷歌上也很难找到答案。

有可能做一些类似…的事情吗。。

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

bomb只是一个具有方法setX和setY的对象,我只是想知道是否可以以某种方式将方法调用串在一起,以节省空间并使其更具可读性?我相信我以前也见过类似的东西。。

哦,我真的在这里的java工作。尽管我很想知道c++中是否也存在这样的简写,如果有人知道的话:)

如果setX返回炸弹,则是。

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

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

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

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

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

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

等等。

为了使此语法正常工作,setX必须返回其操作的对象。这种情况相当普遍。在C++中,您返回一个对自身的引用-有关示例,请参阅C++流。

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

据我所知,您谈论的是链接调用(当所有void方法都返回此值时)。这个特性被提议在Java7中使用,但据我所知被拒绝了。因此,目前在java中还没有用于链接调用的内置机制。看看Builder的设计模式,它非常接近,但是为只读类设计的。

此外,您还可以自己实现Fluent接口。

或多或少是的。

如果Bomb.setX()返回自己的实例,它就会工作。

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

完整的主题叫做流利的界面。

但不幸的是,大多数JavaLib,以及据我所知,完整的Java核心,都没有遵循这个想法。更糟糕的是,JavaBean规范(定义变量、getter和setter之间关系的东西)并不是基于这个原则的。因此,如果您有一个需要JavaBeans的框架,那么它可能会也可能不会与这样的类一起工作。

如果方法定义正确,那么是的!实际上,您正在寻找的是一个流畅的界面。fluent接口的主要目标是方法链接。例如,构建器通常是以这种方式实现的,你会得到:

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

您只需要在setX和setY中返回(例如)"this"。

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

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

考虑到ApacheBeanutils使用它,许多Apache框架可能会决定该属性是只读的。

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

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