转载

Picasso 源码 commit 日记(5):如何写一个严谨的工具类?

以下代码笔记基于 commitId :aef01ed7565a88392e4bb32d8deb986aab6d0177,commit 时间:2013/2/21, 12:53 AM。点击上面的 commitId 可以跳转到 github 看代码,配合本文阅读。

本系列的文章结构包括以下 5 个部分。 重构 是同样功能的代码的变动。 feature 是对比上次提交,这次提交的新功能。 设计 是我觉得可以提一下的代码设计,这部分可能不同的程序员会做不同的设计。 疑惑 是我看代码过程中觉得有问题或者不懂的地方。 知识点 是关于 Java 或者安卓的一些通用知识。

重构

抽取成 Utils 类

由于 Picasso.java checkNotMain 方法在几个地方都有用到,所以把它抽取成工具类里的静态方法。

final class Utils {
  static void checkNotMain() {
    if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
      throw new IllegalStateException("Method call should not happen from the main thread.");
    }
  }

  private Utils() {
    // No instances.
  }
}
复制代码

优化代码可读性

for (Iterator<Entry> i = lruEntries.values().iterator(); i.hasNext(); )

改成了

Iterator<Entry> i = lruEntries.values().iterator();
while (i.hasNext())
复制代码
Map.Entry<String, Entry> toEvict = lruEntries.entrySet().iterator().next();
remove(toEvict.getKey());

改成了

remove(lruEntries.entrySet().iterator().next().getKey());
复制代码
import static com.squareup.picasso.external.DiskLruCache.open;
diskLruCache = open(directory, 1, 1, maxSize);

改成了

diskLruCache = DiskLruCache.open(directory, 1, 1, maxSize);
复制代码

一些变量提升成类静态常量,常量名字改成大写

  • private static final Handler handler 里面 handler 改成了 HANDLER
  • this.retryCount = 2; 改成了 this.retryCount = DEFAULT_RETRY_COUNT; 。声明了一个静态常量 DEFAULT_RETRY_COUNT = 2

不需要 getter 和 setter 封装。

把 Request.java 里面的很多 getter 和 setter 方法都取消了,改成直接访问 Request.java 的成员变量。例如

existing.getFuture().cancel(true); // 笔者注:existing 是一个 request
改成了
existing.future.cancel(true);
复制代码

注意 Request.java 里面的这些成员变量是 protected 的,所以属于包内可见。

feature

可以配置 error drawable

这个和commit 日记(2) 写的配置 placeHolder 差不多。

疑惑

placeholderResId 检测出错

在 Builder 里用 placeholderResId 设置 placeholder 的方法里,先检测了如果 placeholderResId != 0 ,则报错。这里应该检测 placeholderResId <= 0 吧?正确的 placeholderResId 应该是大于 0 的。

public Builder placeholder(int placeholderResId) {
    if (placeholderResId != 0) {
        throw new IllegalArgumentException("Placeholder image resource invalid.");
    }
}
复制代码
原文  https://juejin.im/post/5f1695a5e51d4534942df7aa
正文到此结束
Loading...