Дизайн: Java и возвращение самореференции в инкубационных методах

голоса
19

Я уже предлагал это в моем блоге , но я нахожу это место наиболее подходящим.

Для классов , которые имеют длинный список сеттеры, которые используются часто, я нашел этот способ очень полезным (хотя я недавно прочитал о шаблоне Builder в Effective Java , который является своего рода то же самое).

В принципе, все методы сеттера возвращают самого объекта так, то вы можете использовать такой код:

MyClass
    .setInt(1)
    .setString(test)
    .setBoolean(true);

Инкубационные просто вернуть это в конце концов:

public MyClass setInt(int anInt) {
    // [snip]
    return this;
}

Каково твое мнение? Каковы плюсы и минусы? Имеет ли это какое-либо влияние на производительность?

Задан 28/08/2008 в 04:03
источник пользователем
На других языках...                            


11 ответов

голоса
13

@pek
Прикованного призывание является одним из предложений на Java 7. Это говорит , что если тип метод возврата является недействительным, он должен безоговорочно вернуть это . Если вы заинтересованы в этой теме, есть куча ссылок и простой пример на Java 7 страницы Alex Миллера .

Ответил 31/08/2008 в 19:14
источник пользователем

голоса
8

Это называется свободным интерфейсом , для справки.

Лично я считаю , что это очень аккуратной идея, но это дело вкуса на самом деле. Я думаю , JQuery работает следующим образом.

Ответил 28/08/2008 в 04:25
источник пользователем

голоса
2

Это имеет смысл для строителей, где все, что вы собираетесь сделать, это установить груз вещей, создать реальный объект и бросить строитель прочь. Для строителей, вы можете также избавиться от «набора» части имени методы. Точно так же, неизменные типы не очень нужен «получить».

Something thing = new SomethingBuilder()
    .aProperty(wotsit)
    .anotherProperty(somethingElse)
    .create();

Полезный трюк (если вы не возражаете ~ 2K во время выполнения накладных расходов на класс) заключается в использовании двойной распорки идиомы:

JFrame frame = new JFrame("My frame") {{
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    setLocation(frameTopLeft);
    add(createContents());
    pack();
    setVisible(true);
}};
Ответил 05/09/2008 в 21:47
источник пользователем

голоса
2

Я бы не сделать это сам, потому что мне это мутит, что делает конкретный метод, и метод-цепочка имеет ограниченное применение для меня более делать это от руки. Он не собирается отправить меня в дрожащем шар гнева и психоза, хотя, это всегда хорошо. : ')

Я бы не беспокоиться о производительности; просто спросите Кнут.

Ответил 28/08/2008 в 04:07
источник пользователем

голоса
1

Я считаю, что это в плохом стиле, когда используется в сеттеров. Неизменные классы, как правило, лучше подходят для построения цепочки, такие как:

aWithB = myObject.withA(someA).withB(someB);

где myObjectесть этот класс:

class MyClass {
    withA(TypeA a) {
         this.a.equals(a) ? this : new MyClass(this, a);
    }

    private MyClass(MyClass copy, TypeA a) {
        this(copy);
        this.a = a;
    }
}

Шаблон строителя также полезен, так как позволяет конечный объект неизменяемым, предотвращая промежуточные случаи вы обычно должны создать при использовании этого метода.

Ответил 28/08/2008 в 04:37
источник пользователем

голоса
0

Как использовать

/**
 *
 * @author sanjay
 */
public class NewClass {
private int left ;
private int top;
public void set(int x,int y)
    {
    left=x;
    top=y;
}
public NewClass UP(int x)
    {
    top+=x;
    return this;
}
public NewClass DOWN(int x)
    {
    top-=x;
    return this;
}
public NewClass RIGHT(int x)
    {
    left+=x;
    return this;
}
public NewClass LEFT(int x)
    {
    left-=x;
    return this;
}
public void Display()
    {
    System.out.println("TOP:"+top);
    System.out.println("\nLEFT\n:"+left);
}
}
public static void main(String[] args) {
    // TODO code application logic here
    NewClass test = new NewClass();
    test.set(0,0);
    test.Display();
    test.UP(20).UP(45).DOWN(12).RIGHT(32).LEFT(20);
     test.Display();
Ответил 18/09/2010 в 10:12
источник пользователем

голоса
0

Я закончил тем, что делал это много при работе с библиотекой Apache POI первенствовать; Я закончил тем, что писал вспомогательные методы, прикованные, чтобы я мог применить форматирование, типов данных, данные внутренние ячейки, формулы, и позиционирование клеток.

Для материала с большим количеством маленьких крошечных элементов мухи, которые должны иметь привередливые маленькие хитрости применяется он работает довольно хорошо.

Ответил 02/09/2008 в 17:25
источник пользователем

голоса
0

@Dan снова, в более сложных ситуациях (неизменность приходит в виду) Строителя шаблон является отличным решением.

Кроме того , я согласен с вами , в основном в добытчиками. Я считаю , что вы говорите, в основном следует « Скажите не просите » парадигме и я очень согласен. Но это в большей степени сориентирована на добытчиками.

И, наконец, все перечисленные выше для классов, которые имеют большое количество атрибутов. Я не вижу причин для того, если у вас есть только меньше, чем, скажем, 7.

Ответил 28/08/2008 в 04:47
источник пользователем

голоса
0

Я использую, чтобы быть фанатом Java (и хуже C #) практике создания методов получения и установки (получить заданные свойства) по всему объекту. Это использование быть то, что я считал, объектно-ориентированный, но на самом деле это приводит нас просто выставляя кишки и реализацию объекта, а не на самом деле воспользоваться инкапсуляцией. Есть моменты, вы не можете получить от этого (OR / M приходит на ум), но в целом объект должен быть установлен, а затем выполнять свою функцию. объекты Моя мечта, как правило, имеют один или два конструктора, и, возможно, полтора десятка функций, которые делают работу.

Причина этого заключается в том, что, как только я начал разработку API, существует реальная необходимость держать вещи простыми. Вы действительно только хотите добавить столько сложности, как требуется, чтобы получить работу, и добытчиков и сеттеров, а просто сам по себе, добавить сложность в кучах при добавлении в массе. Что происходит, когда я загружаю сеттер я на другой порядок? Anythign разные? Ты уверен?

Ответил 28/08/2008 в 04:39
источник пользователем

голоса
0

Эта идея рассматривается много в C ++, что позволяет работать с каскадом ...

например


станд :: соиЬ << «это» << «является» << «каскадные» 

где метод потока << возвращает экземпляр себя (* это).

увидеть это: http://www.java2s.com/Tutorial/Cpp/0180__Class/Cascadingmemberfunctioncallswiththethispointer.htm

Ответил 28/08/2008 в 04:34
источник пользователем

голоса
-2

Я согласен с @Bernard, что метод цепочки, как это путает цель сеттеров. Вместо этого я хотел бы предложить, что если вы всегда создавать цепочки сеттеров, как это, что вы создаете пользовательский конструктор для своего класса так вместо

    MyClass
    .setInt(1)
    .setString("test")
    .setBoolean(true)
  ;

Вы делаете

new MyClass(1,"test",true);

Это делает его более удобным для чтения, и вы можете использовать это, чтобы сделать ваш класс неизменен, если вы выбрали.

Ответил 28/08/2008 в 04:28
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more