java – 对象与静态方法的设计

前端之家收集整理的这篇文章主要介绍了java – 对象与静态方法的设计前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如下图所示,有两种简单的方法可以使流式复印机(引入Apache Commons或类似软件).我应该去哪一个,为什么?
public class StreamCopier {
private int bufferSize;

public StreamCopier() {
    this(4096);
}

public StreamCopier(int bufferSize) {
    this.bufferSize = bufferSize;
}

public long copy(InputStream in,OutputStream out ) throws IOException{
    byte[] buffer = new byte[bufferSize];
    int bytesRead;
    long totalBytes = 0;
    while((bytesRead= in.read(buffer)) != -1) {
        out.write(buffer,bytesRead);
        totalBytes += bytesRead;
    }

    return totalBytes;
}
}

VS

public class StreamCopier {

 public static long copy(InputStream in,OutputStream out)
     throws IOException {
     return this.copy(in,out,4096);
 }

 public static long copy(InputStream in,OutputStream out,int bufferSize)
     throws IOException {
     byte[] buffer = new byte[bufferSize];
     int bytesRead;
     long totalBytes = 0;
     while ((bytesRead= in.read(buffer)) != -1) {
         out.write(buffer,bytesRead);
         totalBytes += bytesRead;
     }

     return totalBytes;
}
}

解决方法

我将使用非静态(实例)版本,并将其作为与setter的显式依赖关系提供给消费者:

嘲笑它进行单元测试是微不足道的,所以对消费者的测试并不适用于实施;
交换功能很简单,例如:使用子类;
>依赖注入系统很好地工作.

编辑

在回答“有用的!”评论“这是如何帮助嘲笑”的时候,这是如何工作的:

class ThingThatUsesStreamCopier {

    // our copier instance. set in constructor,but might equally use
    // a setter for this:
    private StreamCopier copier;

    public ThingThatUsesStreamCopier(StreamCopier copier) {
        this.copier = copier;
    }

    public void makeCopy(Stream in,Stream out) {
        // probably something a little less trivial...
        copier.copy(in,out);
    }
}

当我来测试ThingThatUsesStreamCopier时,我可以创建一个mock object版本的StreamCopier,并使用这个模拟实例化ThingThatUsesStreamCopier.

通过这样做,我完全控制了我的模拟行为,所以我的测试与StreamCopier的任何实际实现脱钩.我只是测试消费者,而不是消费者加消费.

猜你在找的Java相关文章