Есть ли хороший способ объявить метод как `return this`? - PullRequest
3 голосов
/ 25 апреля 2011

Примерно так:

class C {

    typeof(this) foo() { return this; }

}

Ну, я знаю, что это невозможно в Java 6, поэтому я буду рад узнать, смогу ли я сделать это в Java 7.

EDIT

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

class Entity {

    typeof(this) refresh();

    typeof(this) clone();

    typeof(this) detach();

}

class FooEntity extends Entity {

    @Override
    typeof(this) detach() {
        fooLink21.removeRef(this); 
        bar39.detach(); 
        return this; 
    }

    void doSomeInteresting() {}
}

fooEntity.clone().detach().doSomeInteresting();

и многое другое.

Я считаю, что добавить эту функцию в компилятор должно быть очень легко, может быть, мне стоит взломать openjdk или gcj?

Кстати, мне никогда не удавалось восстановить openjdk.

Ответы [ 4 ]

5 голосов
/ 25 апреля 2011

Если вы используете дженерики, это может выглядеть примерно так:

class Parent<C extends Parent> {

   public C getMe (){
      return this;
   }
}

class Sub extends Parent<Sub> { }

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

2 голосов
/ 25 апреля 2011

Я не думаю, что есть какой-либо способ сделать это ни в Java 6, ни в Java 7. Добавление этого было бы непростым - я думаю, что возвращаемый тип будет тем, что называется «зависимым типом», и это что-то изгораздо более сложная система типов, чем в Java в настоящее время.

Ответ Гресси о добавлении параметра типа в базовый класс - это единственный способ приблизиться к тому, что вы хотите, насколько я знаю.

Однако, если вы были готовы использовать вспомогательную функцию, вы могли бы сделать это без параметра типа в классе:

abstract class Entity {
    public static <T extends Entity> T detach(T entity) {
        entity.detach();
        return entity;
    }
    protected abstract void detach();
}

Тогда вы могли бы сказать:

import static Entity.detach;

detach(fooEntity).doSomeInteresting();

Этодовольно неуклюжий, хотя.

1 голос
/ 25 апреля 2011

Судя по тому, что вы делаете, почему бы не использовать конструктор?Похоже, вы спрашиваете, как вернуть метод?Если так:

Вы можете вернуть метод в Java.Я настоятельно рекомендую вам не делать этого и рассмотреть альтернативы этой практике.Взгляните на java.lang.reflect ;обеспечивает доступ к методам, полям и конструкторам.Java не «предназначена» для работы с первоклассными функциями.Если вы решите это сделать, будьте готовы ко многим заявлениям о вылове ...

1 голос
/ 25 апреля 2011

Я не очень разбираюсь в Java (студент SD второго курса, использующий в основном C # / C ++), но вы можете взглянуть на Generics. Если они относятся к тем, что, по моему мнению, имеют отношение к C ++, C #, они похожи на шаблоны, где вы можете написать методы, которые возвращают тип шаблона.

http://en.wikipedia.org/wiki/Generics_in_Java

...