繁体   English   中英

在不影响接口其他实现的情况下更改Java中的方法签名

[英]changing method signature in java without affecting other implementations of an interface

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

现在,让我们说,我想送一个额外的参数用于执行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),在类BC ,...的情况下,原始实现将被调用并将其写入输出流,而对于A我们将调用优化版本而不创建大类中间对象。 我更改了x(String in, OutputStream os)返回值,因为在这种情况下,您无需产生byte[] ,只需在实现中写入输出流即可。

您必须先更改实现x的所有类,才能在接口中更改x的定义。 您可以将x与附加参数一起添加为单独的方法,因为它将只是x的重载版本。 但是,将A的实例视为I时,将无法调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM