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



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

现在假设我想从Ax方法的实现发送一个额外的参数。假设我想要一个新的定义,类似于byte[] x(String in, OutputStream os)

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

OutputStream必须来自@Controller,而该OutputStream必须是不同的流(每个请求的流)。

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

关于如何将该流仅传递给xA类,您有什么建议吗?

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

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

如果不更改接口中所有实现x的类,就无法更改接口中x的定义。您可以将带有附加参数的x作为一个单独的方法添加,因为它只是x的重载版本。但是,当将a的实例视为I时,您将无法调用它。

最新更新