gpt4 book ai didi

java - 在不影响接口(interface)的其他实现的情况下更改java中的方法签名

转载 作者:行者123 更新时间:2023-11-29 07:37:34 25 4
gpt4 key购买 nike

假设我有一个名为 A 的 Java 类和一个名为 I 的接口(interface)。 A 类实现接口(interface)I。接口(interface) I 具有以下方法定义 byte[] x(String in)。接口(interface)I也被其他类实现,如BCD等。

现在假设我想为 A 中的 x 方法的实现发送一个额外的参数。假设我想要一个新定义,类似于 byte[] x(String in, OutputStream os)

有没有办法在x方法中传递那个OutputStream os而不影响其他实现?问题是,如果我在 I 中进行更改,我必须在所有实现中进行此更改,这是不正确的。如果我选择更改 x 方法签名,我将不得不在所有方法中更改它并在代码中的所有位置传递第二个参数。

那个 OutputStream 必须来自 @Controller 而这个 OutputStream 必须是一个不同的流(每个请求一个流)。

我的实现是在@Service中使用的@Component

关于如何将该流仅传递给我的 xA 类,您有什么建议吗?

x 的实际目的是将返回的字节写入生成文件。发送 OutputStream 将以某种方式确定返回类型成为 void,因为数据将直接发送到流。

最佳答案

是的,您可以在 Java 8 中使用接口(interface)中的默认方法来实现:

public interface I {
byte[] x(String in);
default byte[] x(String in, OutputStream os) {
return x(in);
}
}

因此,所有实现I 的类都包含旧方法 x(String in) 的实现,并从接口(interface)继承新方法 x(String in, OutputStream os) 的默认实现。您可以仅在需要此方法的特定行为的一个类中重写和重新实现新方法。

作者在评论中解释他的问题的更新(A 生成大字节[] 对象,因此,仅在这个A 类中我们想通过直接写入 OutputStream 来实现优化):

public interface I {
byte[] x(String in);
default void x(String in, OutputStream os) {
try {
os.write(x(in));
} catch (IOException e) {
//handle it
}
}
}

因此,您从 Controller 调用 x(String in, OutputStream os),如果类 B, C, ... 原始实现将被调用并且写入输出流,而对于 A 我们将调用优化版本而不创建大的中间对象。我更改了 x(String in, OutputStream os) 的返回值,因为在那种情况下你不需要生成 byte[],你只需要在实现中写入输出流.

关于java - 在不影响接口(interface)的其他实现的情况下更改java中的方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837172/

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