将方法声明为`return this`的任何好方法?

时间:2011-04-25 12:46:41

标签: java design-patterns generics java-7 crtp

这样的事情:

class C {

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

}

嗯,我知道在Java 6中这是不可能的,所以我很高兴听到我是否可以在Java 7中完成它。

修改

这对链接方法调用很有用,并且避免创建临时局部变量,如下所示:

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 个答案:

答案 0 :(得分:5)

如果您使用泛型,它可能看起来有点像这样:

class Parent<C extends Parent> {

   public C getMe (){
      return this;
   }
}

class Sub extends Parent<Sub> { }

它可能有用,但我不建议编写这样的代码。这是糟糕的设计...

答案 1 :(得分:2)

我认为没有办法在Java 6或Java 7中做到这一点。添加它并不容易 - 我认为返回类型将是所谓的“依赖类型”,这是来自比Java目前更复杂的类型系统。

就我所知,Gressie关于向基类添加类型参数的答案是接近你想要的唯一方法。

但是,如果您准备使用辅助函数,则可以在类上没有类型参数的情况下执行此操作:

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();

但这很笨重。

答案 2 :(得分:1)

我对Java(二年级SD学生主要使用C#/ C ++)知之甚少,但你可能想看看泛型。如果它们与我认为它们与C ++,C#有关,它们就像模板一样,您可以编写返回模板类型的方法。

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

答案 3 :(得分:1)

从你看起来的样子,为什么不使用构造函数?看起来你可能会问如何返回一个方法?如果是这样的话:

您可以使用Java返回方法。我强烈建议你不要考虑这种做法的替代方案。看看 java.lang.reflect ;提供对方法,字段和构造函数的访问。 Java并不意味着要处理一流的功能。如果您决定这样做,请准备好接受大量的报道......