Android开发

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

本文主要是介绍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.");
    }
}
复制代码

知识点

如何写一个严谨的工具类

注意本文一开头的工具类的一些细节: final class 、private contructor 。

这篇关于Picasso 源码 commit 日记(5):如何写一个严谨的工具类?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!