gpt4 book ai didi

java - 使用(空)默认方法制作 FunctionalInterface

转载 作者:行者123 更新时间:2023-11-30 10:17:43 24 4
gpt4 key购买 nike

在 Java 8 中,引入了接口(interface)的默认方法,以便在不破坏向后兼容性的情况下向现有接口(interface)添加方法。

由于默认方法是非抽象的,因此它们可用于制作具有多个可覆盖方法的 FunctionalInterface

例如,StringTransformer 接口(interface)有两个方法,transform,将给定的 Stringend 转换为免费资源:

interface StringTransformer {
String transform(String s);

void end();
}

但有些实现可能没有资源可以释放,所以我们可以为 end 提供空的默认方法,并为 StringTransformer 使用 lambda 函数和方法引用:

interface StringTransformer {
String transform(String s);

default void end() {
}
}

StringTransformer x = String::trim;
StringTransformer y = (x -> x + x);

这是有效/最佳实践,还是反模式和滥用默认方法?

最佳答案

this answer 中所述,允许创建具有多个方法的接口(interface)仍然是功能接口(interface),是默认方法的目的之一。正如那里也提到的,您将在 Java API 本身中找到示例,比如 Comparator , Predicate , 或 Function ,具有默认方法并有意成为功能接口(interface)。

default 实现是否什么都不做并不重要,更重要的问题是,这个默认实现有多自然。只是为了让 lambda 成为可能,这感觉像是一种拼凑,还是它确实是一些甚至大多数实现会以任何方式使用的东西(不管它们是如何实现的)?

不需要特殊的清理操作可能确实是常见情况,即使您遵循评论中提出的建议,让您的界面扩展 AutoCloseable并将方法命名为 close 而不是 end。请注意,同样,Stream 实现了 AutoCloseable,其默认行为是在 close() 上不执行任何操作。您甚至可以遵循该模式以允许将清理操作指定为单独的 Runnable,类似于 Stream.onClose(Runnable) :

public interface StringTransformer extends UnaryOperator<String>, AutoCloseable {
static StringTransformer transformer(Function<String,String> f) {
return f::apply;
}
String transform(String s);
@Override default String apply(String s) { return transform(s); }
@Override default void close() {}
default StringTransformer onClose(Runnable r) {
return new StringTransformer() {
@Override public String transform(String s) {
return StringTransformer.this.transform(s);
}
@Override public void close() {
try(StringTransformer.this) { r.run(); }
}
};
}
}

这允许通过 onClose 注册清理操作,因此以下工作:

try(StringTransformer t = 
StringTransformer.transformer(String::toUpperCase)
.onClose(()->System.out.println("close"))) {
System.out.println(t.apply("some text"));
}

回复

try(StringTransformer t = transformer(String::toUpperCase)
.onClose(()->System.out.println("close 1"))) {
System.out.println(t.apply("some text"));
}

如果您使用import static。如果您链接多个操作,它还可以确保安全关闭

try(StringTransformer t = transformer(String::toUpperCase)
.onClose(()->System.out.println("close 1"))
.onClose(()->{ throw new IllegalStateException(); })) {
System.out.println(t.apply("some text"));
}

try(StringTransformer t = transformer(String::toUpperCase)
.onClose(()->{ throw new IllegalStateException("outer fail"); })
.onClose(()->{ throw new IllegalStateException("inner fail"); })){
System.out.println(t.apply("some text"));
}

请注意 try(StringTransformer.this) { r.run(); } 是 Java 9 语法。对于 Java 8,您需要 try(StringTransformer toClose = StringTransformer.this) { r.run();

关于java - 使用(空)默认方法制作 FunctionalInterface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49604378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com