guava深入理解(2)-前置条件Preconditions

前置条件检测和null处理有异曲同工之妙,也是我们天天都在做的,比如传入一个索引,我们可能需要检查他的值是不是超过了数组大小。

说白了,我们会需要写这种检测,还是因为类型系统的问题,类型系统可以限制一个类型能做的事情,却没法限制类型本身的数据。比如一个数字1,和一个数字100,他们是同一个类型,但是代表的却是不同的意义,所以我觉得,这种检测,其实也是属于类型检测的一部分,如果可以的话,我感觉也可以像kotlin处理null类型一样,写在参数里
类似这样

 public void test(int a:a>0&&a<10)
    {
        ///
    }

当然,这只是我美好的设想,目前我暂时没有找到支持把这种前置条件检测写在形参块里的语言,所以我们还是只能把这种繁琐的条件检测手动写在方法体里。

虽然没有语言级别的支持,还是可以用类库,稍稍减轻一下手动编码的痛苦。
类似这种前置条件检测的类库非常多,那么guava的优势在哪里呢。
以下是guava官方自己说的,实际上我感觉用apache的也差不多
1.guava的方法名更加清楚(实际上好多程序员英文都看不怎么懂这条就忽略吧)
2.方法会返回原参数
3.参数更加简单

//手写的检测 (如果你还在这样写的话,赶快找一个库用吧)
if(someObj == null){
throw new IllegalArgumentException(" someObj must
not be null");
}
//用guava写
checkNotNull(someObj,"someObj must not be null");
public PreconditionExample(String label) {
//检查null
this.label = checkNotNull(label,"Label can''t be null");
}
public void updateCurrentIndexValue(int index, int valueToSet) {
//检查索引
this.currentIndex = checkElementIndex(index, values.length,
"Index out of bounds for values");
//检查bool
checkArgument(valueToSet <= 100,"Value can't be more than
100");
values[this.currentIndex] = valueToSet;
}
public void doOperation(){
checkState(validateObjectState(),"Can't perform operation");
}

其实和junit的类有些类似,不过guava这个是专门检查参数的,所以用起来稍微简单一些。

其实在实际编码中,我发现很多人写代码的时候,都没有写全或者根本没有写前置条件检测,甚至在很多商业项目里也是这样。这个我觉得还是要写全一点比较好,不要在等出错了再来改代码,错误就应该及早报出来,虽然确实会多写不少代码。

这个东西其实自己写个工具类估计也就十来分钟的事情,不过主要学习的是一种思想,要积极的在自己的代码里用起来,不能说是看过就算了。


欢迎关注我的github
https://github.com/luckyCatMiao

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Guava类库中的Table是一个双键的Map,可以理解为一个行列式的数据结构。 Table可以用来表示一个映射,其中每个键都有一个与之关联的值,而且这个键需要由两个参数来确定。在Table中,第一个键称为"行键",第二个键称为"列键",而对应的值称为"值"。 Table的实现方式可以看作是一个Map<RowKey, Map<ColumnKey, Value>>的嵌套结构,其中RowKey和ColumnKey分别表示行键和列键,Value表示对应的值。 Table提供了多种视图,包括行视图、列视图、单元格视图等,这些视图可以方便地进行表格的操作和查询。 下面是一个简单的示例代码: ```java Table<String, String, Integer> table = HashBasedTable.create(); table.put("row1", "col1", 1); table.put("row1", "col2", 2); table.put("row2", "col1", 3); table.put("row2", "col2", 4); System.out.println(table.get("row1", "col1")); // 输出1 System.out.println(table.row("row1")); // 输出{col1=1, col2=2} System.out.println(table.column("col1")); // 输出{row1=1, row2=3} System.out.println(table.cellSet()); // 输出[(row1,col1)=1, (row1,col2)=2, (row2,col1)=3, (row2,col2)=4] ``` 在上面的示例中,我们创建了一个Table对象,并往其中添加了四个元素。然后,我们分别通过get方法、row方法、column方法和cellSet方法获取了对应的视图,并输出了它们的内容。 需要注意的是,Table中的行键、列键和值都可以为null,但是在使用时需要特别注意空指针异常的问题。此外,Table中的行键和列键必须实现equals和hashCode方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值