Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java虚拟字段模式_Java - Fatal编程技术网

Java虚拟字段模式

Java虚拟字段模式,java,Java,我试图理解并实现Java虚拟字段模式。到目前为止,我还没有找到很多关于它的例子或资源。这篇文章解释了这一点,但没有明确说明应该如何实施。是否有人能够更好地解释它或使用一个新的示例?我将尝试使用一个类似于链接资源中链接的示例来解释该模式 假设有这样一个peek界面: interface Peeker<T> { T peek(); T take(); } 为了避免这个样板文件(特别是如果您有许多其他类以类似方式使用peek),您可以使用上面提到的模式。您可以扩展peek

我试图理解并实现Java虚拟字段模式。到目前为止,我还没有找到很多关于它的例子或资源。这篇文章解释了这一点,但没有明确说明应该如何实施。是否有人能够更好地解释它或使用一个新的示例?

我将尝试使用一个类似于链接资源中链接的示例来解释该模式

假设有这样一个
peek
界面:

interface Peeker<T> {
    T peek();
    T take();
}
为了避免这个样板文件(特别是如果您有许多其他类以类似方式使用
peek
),您可以使用上面提到的模式。您可以扩展
peek
界面,并使用默认方法委派所有调用:

interface PeekerView<T> extends Peeker<T> {

    Peeker<T> getPeeker();

    default T peek() {
        return getPeeker().peek();
    }
    default T take() {
        return getPeeker().take();
    }
}
要实现该模式,基本上只需将所有委托调用移动到
PeekerView
接口的默认方法



顺便说一句,我认为Brian Goetz称之为“虚拟场模式”并不是最好的名称。我想,如果你只看接口,这是有意义的——在这种情况下,getter就像一个虚拟字段。但是,如果你看一下整个事情,包括实现类,它实际上就像某种mixin(在另一个类中也被称为mixin)。我会把它称为Mixin模式,因为我更经常看到它被称为Mixin模式。

我以前从未听说过“虚拟场”这个词。看来作者只是想重新创造计算/合成属性。@chrylis我不这么认为。看起来它正在使用默认方法来模拟属性混合。@可能是shmosel。我会说“使用Groovy”。-)如果您感兴趣,我已经将该模式实现为注释处理器。我甚至在考虑将它发布到maven central。
interface PeekerView<T> extends Peeker<T> {

    Peeker<T> getPeeker();

    default T peek() {
        return getPeeker().peek();
    }
    default T take() {
        return getPeeker().take();
    }
}
class Foo implements PeekerView<T>{

    private Peeker<T> peeker = new PeekerImpl();

    public Peeker<T> getPeeker() {
        return peeker;
    }

}