加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:22:06 所属栏目:Java 来源:网络整理
导读:如下图所示,有两种简单的方法可以使流式复印机(引入Apache Commons或类似软件).我应该去哪一个,为什么? public class StreamCopier {private int bufferSize;public StreamCopier() { this(4096);}public StreamCopier(int bufferSize) { this.bufferSize =
如下图所示,有两种简单的方法可以使流式复印机(引入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的任何实际实现脱钩.我只是测试消费者,而不是消费者加消费.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读