假设我有一个名为A
的Java类和一个名为I
的接口。 A
类实现接口I
。接口I
具有以下方法定义byte[] x(String in)
。接口I
也由其他类实现,如B
,C
,D
等。
现在让我们说我想从x
发送一个额外的论据来实现A
方法。让我们说我想要一个新的定义,比如byte[] x(String in, OutputStream os)
。
有没有办法在OutputStream os
方法中传递x
而不影响其他实现?问题是如果我在I
进行更改,我必须在所有实现中进行此更改,这是不正常的。如果我选择更改x
方法签名,我将不得不在所有方法中更改它,并在代码中的任何位置传递第二个参数。
OutputStream
必须来自@Controller
且此OutputStream
必须是不同的流(每个请求的流)。
我的实现@Component
中使用了@Service
。
对于如何仅将该流传递到A
的{{1}}课程,您有任何建议吗?
x
的实际目的是编写返回的咬合以生成文件。发送x
将以某种方式确定返回类型为OutputStream
,因为数据将直接发送到流。
答案 0 :(得分:5)
是的,您可以使用接口中的默认方法在Java 8中执行此操作:
public interface I {
byte[] x(String in);
default byte[] x(String in, OutputStream os) {
return x(in);
}
}
因此,所有实现 I 的类都包含旧方法x(String in)的实现,并从接口继承新方法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
}
}
}
因此,在类B
,C
的情况下,从控制器调用x(String in,OutputStream os)...原始实现将被调用并写入输出流,而对于A,我们将调用优化版本而不创建大型中间对象。我更改了x(String in, OutputStream os)
的返回值,因为在这种情况下您不需要生成byte[]
,您只需在实现中写入输出流。
答案 1 :(得分:0)
您无法在不更改实现它的所有类的情况下更改界面中x的定义。您可以使用附加参数作为单独的方法添加x,因为它只是x的重载版本。但是,在将A的实例视为I时,您将无法调用它。