假设我调用了一个Java类,A并调用了一个接口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必须来自a @Controller,这OutputStream必须是一个不同的流(每个请求一个流).
我的实现@Component用于@Service.
您对如何将该流仅传递给我的A班级有任何建议x吗?
实际目的x是编写返回的bites以生成文件.发送OutputStream遗嘱会以某种方式确定要返回的返回类型,void因为数据将直接发送到流.
是的,您可以使用接口中的默认方法在Java 8中执行此操作:
public interface I {
byte[] x(String in);
default byte[] x(String in, OutputStream os) {
return x(in);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,实现I的所有类都包含旧方法x(String in)的实现,并从接口继承新方法x(String in,OutputStream os)的默认实现.您只能在需要此方法的特定行为的一个类中覆盖并重新实现新方法.
作者在注释中解释他的问题的更新(A生成big byte []对象,因此,只有在这个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
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,你从你的控制器调用X(字符串中的OutputStream OS),在类情况下B,C...原来执行将被调用,并写入到输出流,而对于我们称之为不创造大中间对象的优化版本.我更改了返回值x(String in, OutputStream os),因为在这种情况下你不需要生成byte[],你只需在实现中写入输出流.
| 归档时间: |
|
| 查看次数: |
1181 次 |
| 最近记录: |