更改java中的方法签名而不影响接口的其他实现

时间:2015-11-20 22:33:18

标签: java

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

现在让我们说我想从x发送一个额外的论据来实现A方法。让我们说我想要一个新的定义,比如byte[] x(String in, OutputStream os)

有没有办法在OutputStream os方法中传递x而不影响其他实现?问题是如果我在I进行更改,我必须在所有实现中进行此更改,这是不正常的。如果我选择更改x方法签名,我将不得不在所有方法中更改它,并在代码中的任何位置传递第二个参数。

OutputStream必须来自@Controller且此OutputStream必须是不同的流(每个请求的流)。

我的实现@Component中使用了@Service

对于如何仅将该流传递到A的{​​{1}}课程,您有任何建议吗?

x的实际目的是编写返回的咬合以生成文件。发送x将以某种方式确定返回类型为OutputStream,因为数据将直接发送到流。

2 个答案:

答案 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
        }
    }
}

因此,在类BC的情况下,从控制器调用x(String in,OutputStream os)...原始实现将被调用并写入输出流,而对于A,我们将调用优化版本而不创建大型中间对象。我更改了x(String in, OutputStream os)的返回值,因为在这种情况下您不需要生成byte[],您只需在实现中写入输出流。

答案 1 :(得分:0)

您无法在不更改实现它的所有类的情况下更改界面中x的定义。您可以使用附加参数作为单独的方法添加x,因为它只是x的重载版本。但是,在将A的实例视为I时,您将无法调用它。