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