`
ajoo
  • 浏览: 452765 次
社区版块
存档分类
最新评论

瓜娃系列 (7) - 外面很多坏银地

阅读更多
为人父母, 一个比较纠结的事情, 就是到底怎么保护那个啥也不懂的小家伙. 如果护着她太紧了, 会不会让她失去和外部接触, 学习的机会, 变得孤僻, 依赖性强? 如果保护不利, 被人欺负了, 或者甚至被拐跑了, 后悔药没地方买呀. 到底要不要告诉她外面有很多坏人呐?

唉. 不自寻烦恼了. 埋头写代码!

不过, 嗯, 这个好像我写代码怎么也在想着类似的东西? "要不要检查这个参数是不是null?", "要不要判断当前状态对不对?"

一个好编程习惯是尽量不要用null, 除非特殊情况, 参数都不允许是null. 而那些特殊的需要null的场合, 用@Nullable标注出来.

一般情况下, 如果你马上就会调用girl.kiss(), 这个girl如果是null的话, 你马上就能即时得到一个NullPointerException, jvm已经帮你做了null检查. 但是有时候, 比如对构造函数来说, 参数不是马上使用, 而是存在成员变量里面, 以后再用. 这时候检查就很重要了. 否则, 如果客户不小心传递一个null, 错误就要延后到可能很久以后才会发现了.

最直观的检查就是:
if (girl == null) {
  throw new NullPointerException("谁这么缺德, 给我一个山寨美眉呀?!");
}


但是这有点繁琐, 瓜娃有一个工具, 叫Preconditions.

用它, 上面的代码可以简化成:
Preconditions.checkNotNull(girl, "谁这么缺德, 给我一个山寨美眉呀?!");


Preconditions还有两个常用的检查: checkArgument()和checkState(). 用法大同小异. 一个用来检查参数, 一个用来检查对象状态. 一个抛IllegalArgumentException, 一个抛IllegalStateException.

Preconditions这些工具函数有一个潜在的问题: 当你写测试同时用测试覆盖工具的时候, 如果你用传统的if-else, 测试覆盖工具会告诉你如果你忘记了测试那个错误情况. 而用了Preconditions, 这些工具就被骗了, 只会傻乎乎地报告100%覆盖.

7
0
分享到:
评论
8 楼 zskangs1126 2012-02-02  
Preconditions  这个类在哪个包里面?
7 楼 zskangs1126 2012-02-02  
    好文章。。学习了。
6 楼 huang_yong 2010-11-25  
整个八月一下出了七片连载,我等看官爽啊
ajoo 写道
dogstar 写道
坏人,继续啊.


嗯. 我的目标是介绍一些最常用, 而且比较简单的工具. guava里面其它的东西要不我没用过, 要不感觉不是那种几乎每天都要用到的.

剩下的, 大致符合这个标准的, 大概就是Objects, Multimap和Multiset. Multiset个人感觉用处不小, 但是它的抽象视角有点别扭. 你觉得哪个更有用点?




个人感觉 MultiMap 比较有用,处理统计的时候可以考虑使用,BiMap 还不错哦!
5 楼 ajoo 2010-08-31  
dogstar 写道
ajoo 写道
dogstar 写道
坏人,继续啊.


嗯. 我的目标是介绍一些最常用, 而且比较简单的工具. guava里面其它的东西要不我没用过, 要不感觉不是那种几乎每天都要用到的.

剩下的, 大致符合这个标准的, 大概就是Objects, Multimap和Multiset. Multiset个人感觉用处不小, 但是它的抽象视角有点别扭. 你觉得哪个更有用点?



其实,俺就是用了用preconditions,lists,以及所谓的transform之流.

java还是让人怒其不争,写起代码,没有高潮.

我特意没有介绍transform list等东东. 我自己也会用到. 但是感觉写
Iterable<String> transformed = Iterables.transform(myList, new Function<Integer, String>() {
  @Override public String apply(Integer i) {
    return Integer.toString(i);
  }
});

真不见得比直接写
List<String> transformed = new AbstractList<String>() {
  @Override public String get(int i) {
    return Integer.toString(myList.get(i));
  }
  @Override public int size() {
    return myList.size();
  }
};

更简单多少. 而后者是标准jdk, 返回的是一个List, 而不是连get()都没有的Iterable.

不过让我们祈祷吧, 如果java 7加入了closure, 甚至以及defender method extension, 那么最终transform的语法会简单到:
myList.transform(Integer#toString);

哈哈! 嗯, 正吃大餐呢, 别吵醒我.
4 楼 dogstar 2010-08-31  
ajoo 写道
dogstar 写道
坏人,继续啊.


嗯. 我的目标是介绍一些最常用, 而且比较简单的工具. guava里面其它的东西要不我没用过, 要不感觉不是那种几乎每天都要用到的.

剩下的, 大致符合这个标准的, 大概就是Objects, Multimap和Multiset. Multiset个人感觉用处不小, 但是它的抽象视角有点别扭. 你觉得哪个更有用点?



其实,俺就是用了用preconditions,lists,以及所谓的transform之流.

java还是让人怒其不争,写起代码,没有高潮.
3 楼 ajoo 2010-08-29  
dogstar 写道
坏人,继续啊.


嗯. 我的目标是介绍一些最常用, 而且比较简单的工具. guava里面其它的东西要不我没用过, 要不感觉不是那种几乎每天都要用到的.

剩下的, 大致符合这个标准的, 大概就是Objects, Multimap和Multiset. Multiset个人感觉用处不小, 但是它的抽象视角有点别扭. 你觉得哪个更有用点?


2 楼 goncha 2010-08-25  
整个八月一下出了七片连载,我等看官爽啊!
1 楼 dogstar 2010-08-25  
坏人,继续啊.

相关推荐

Global site tag (gtag.js) - Google Analytics