[英]changing method signature in java without affecting other implementations of an interface
假设我有一个名为A
的Java类和一个名为I
的接口。 A
类实现接口I
接口I
具有以下方法定义byte[] x(String in)
。 接口I
也由其他类(如B
, C
, D
等)实现。
现在,让我们说,我想送一个额外的参数用于执行x
方法从A
。 假设我想要一个新的定义,例如byte[] x(String in, OutputStream os)
。
有什么方法可以在不影响其他实现的情况下在x
方法中传递OutputStream os
? 问题是,如果我在改变I
,我不得不做出这个改变在所有实现这也不行。 如果选择更改x
方法签名,则必须在所有方法中都对其进行更改,并将第二个参数传递给代码中的所有位置。
该OutputStream
必须来自@Controller
并且此OutputStream
必须是不同的流(每个请求一个流)。
我的实现是@Service
使用的@Component
。
您是否有关于如何仅将流传递给x
A
类的任何建议?
x
的实际用途是写入返回的位以生成文件。 发送OutputStream
将以某种方式确定返回类型变为void
因为数据将直接发送到流。
是的,您可以在Java 8中使用接口中的默认方法来执行此操作:
public interface I {
byte[] x(String in);
default byte[] x(String in, OutputStream os) {
return x(in);
}
}
因此,实现我的所有类都包含旧方法x(String in)的实现,并从接口继承新方法x(String in,OutputStream os)的默认实现。 您只能在需要此方法特定行为的一类中重写和重新实现新方法。
作者在注释中对其问题的解释的更新 ( A
生成大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
}
}
}
因此,您从控制器调用x(String in,OutputStream os),在类B
, C
,...的情况下,原始实现将被调用并将其写入输出流,而对于A我们将调用优化版本而不创建大类中间对象。 我更改了x(String in, OutputStream os)
返回值,因为在这种情况下,您无需产生byte[]
,只需在实现中写入输出流即可。
您必须先更改实现x的所有类,才能在接口中更改x的定义。 您可以将x与附加参数一起添加为单独的方法,因为它将只是x的重载版本。 但是,将A的实例视为I时,将无法调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.