假设我有一个Java类A
和一个接口I
。A
类实现了接口I
。接口I
具有以下方法定义byte[] x(String in)
。接口I
也由B
、C
、D
等其他类实现
现在假设我想从A
为x
方法的实现发送一个额外的参数。假设我想要一个新的定义,类似于byte[] x(String in, OutputStream os)
。
有没有任何方法可以在不影响其他实现的情况下,在x
方法中传递OutputStream os
?问题是,如果我在I
中进行更改,我必须在所有实现中进行此更改,这是不好的。如果我选择更改x
方法签名,我将不得不在所有方法中更改它,并在代码中的任何地方传递第二个参数。
该OutputStream
必须来自@Controller
,而该OutputStream
必须是不同的流(每个请求的流)。
我的实现是@Service
中使用的@Component
。
关于如何将该流仅传递给x
的A
类,您有什么建议吗?
x
的实际用途是写入返回的bites以生成文件。发送OutputStream
将以某种方式确定返回类型为void
,因为数据将直接发送到流。
是的,您可以在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[]
,只需在实现中写入输出流即可。
如果不更改接口中所有实现x的类,就无法更改接口中x的定义。您可以将带有附加参数的x作为一个单独的方法添加,因为它只是x的重载版本。但是,当将a的实例视为I时,您将无法调用它。