Можете ли вы вызвать несколько методов для объекта одновременно? - PullRequest
2 голосов
/ 07 января 2012

Просто маленький вопрос, у меня тоже были проблемы с поиском ответа.

Можно ли сделать что-то вроде ..

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

бомба - это просто объект с методами setX и setY, мне просто интересно, могли бы вы как-нибудь связать вызовы методов, чтобы сэкономить место и сделать вещи более читабельными для человека? Я уверен, что я видел нечто подобное раньше ...

Ох, я здесь работаю в Яве. Хотя мне было бы интересно узнать, существует ли такая стенография и в c ++, если кто-нибудь знает:)

Ответы [ 8 ]

6 голосов
/ 07 января 2012

Если setX возвращает бомбу, то да.

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

Назовите это Свободный интерфейс . Для достижения этого свободного интерфейса используется метод, называемый метод цепочки .

В программной инженерии плавный интерфейс (впервые разработанный Эриком Эвансом и Мартином Фаулером) представляет собой реализацию объектно-ориентированного API, цель которого - обеспечить более читаемый код. Свободный интерфейс обычно реализуется с использованием цепочки методов для ретрансляции контекста команды последующего вызова (но свободный интерфейс влечет за собой нечто большее, чем просто цепочка методов). [1]

2 голосов
/ 07 января 2012

Как я понимаю, вы говорите о цепочечном вызове (когда все пустые методы возвращают это). Эта функция предлагается быть в Java 7, но я отклонил, насколько я знаю. Таким образом, сегодня нет встроенного механизма для цепочки вызовов в Java. Посмотрите на Шаблон проектирования Builder , он очень близок, но предназначен для классов, доступных только для чтения.

Кроме того, вы всегда можете реализовать Свободный интерфейс самостоятельно.

2 голосов
/ 07 января 2012

Чтобы этот синтаксис работал, setX должен возвращать объект, с которым он работает. Это достаточно распространено. В C ++ вы возвращаете ссылку на себя - для примера см. Потоки C ++.

Bomb& Bomb::setX(X& newX) {
    x = newX;
    return *this;
}
2 голосов
/ 07 января 2012

Это не вопрос одновременного вызова нескольких методов, а создания цепочки методов.

Как правило, это возможно, потому что эти методы возвращают this:

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

и т. д.

1 голос
/ 07 января 2012

Ну, если методы правильно определены - тогда да! На самом деле, вы ищете свободный интерфейс . Основной целью свободного интерфейса является метод цепочки. Например, строители часто реализуются таким образом, и вы получаете:

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

Вам просто нужно вернуть (например) "this" в setX и setY.

1 голос
/ 07 января 2012

Больше руды, меньше да.

Это будет работать, если Bomb.setX () вернет свой собственный экземпляр.

class Bomb{

    ...

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

}

Вся тема называется Свободный интерфейс .

Но, к сожалению, большинство Java-библиотек и, насколько мне известно, Java-ядро complate не придерживаются этой идеи. И что еще хуже, спецификация Java-бина (определяющая отношения между переменной, геттером и сеттером) не основана на этом принципе. Так что если у вас есть Framework, который нуждается в Java-бинах, он может работать или не работать с такими классами.

1 голос
/ 07 января 2012

Конечно, вы можете, но для этого каждому сеттеру нужно будет возвращать this, что не так уж хорошо для сеттеров, так как фреймворки больше не смогут их найти. Например, стандарт java.beans.Introspector игнорирует не-1003 * сеттеры:

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 решат, что свойство доступно только для чтения.

0 голосов
/ 07 января 2012

Вы можете, если setX и setY вернуть объект бомбы. Это позволяет вам связывать методы, и это называется Свободный интерфейс . Вы можете посмотреть пример на Java здесь:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...