2019独角兽企业重金招聘Python工程师标准>>>

common,Google Guava,Guice 博客分类: java

1、apache common            http://commons.apache.org

2、Google Guava                http://code.google.com/p/guava-libraries/

3、Google DI框架 Guice    http://code.google.com/p/google-guice/

1、一提到common库,大家第一个肯定Apache有个org.apache.common.*的集合(http://commons.apache.org),里面继承了各种数据结构、文件IO、网络IO、Hash、断言等等很多东西。大致列出了一个比较常用的:

codec : 编码解码算法,如Base64、UrlEncode等

Collections : 扩展jdk的collections集合

Compress : zip、tar等压缩算法

Deamon : Unix后台daemon精灵进程

Dbcp : 可扩展的数据库连接池

JCS : Java带LRU的Cache,可以看成是一个固定大小可自动淘汰key的Map

Pool : “池”化的实现,例如数据库连接池、线程池、对象池都可以基于此进行扩展

可以看出,其实很多功能性的,平时开发中很可能遇到的但jdk中不提供的,一般都可以找到。或者直接用或者直接扩展成自己的类。一般能从中找到的就不要自己实现,因为不一定更好,而且还需要时间的考验。关于Apache Common开发过java的都不陌生,如果你用了SSH就间接的使用了它。这里不做过多讨论了,如果有兴趣可以针对细节再留言探讨哈。

2、Apache Common是一个时间比较久的框架了,Google针对基础框架退出了自己的类库,并且开源出来(http://code.google.com/p/guava-libraries/),名为“Guava”。它在部分功能上其实是ApacheCommon的一个子集,但在性能上做了很多优化,并且针对并发和大规模系统开发做了很多新的策略(如CopyOnWrite、Immutable、SkipList)等。虽然有些类和java.util.concurrent有些重叠,但是在一般环境下都可以替代。

Google比较喜欢java的"链式编程“,很多类都是支持链式的,比如Joiner.on("#").skipNulls().join("a","b","c")。不太熟悉的同学可以Google之。本文针对其中几个特别的实现,以及适用场景进行讲解:

Preconditions : 类似Assert的预言,但处理方式是抛出异常,比如checkNotNull(obj),如果obj是null则会抛出NullPtrException

ImmutableSet/Map : 不可变的set和map,存储constant常量的集合,元素内容和个数不再变化,这里就可以做很多空间和检索上的优化。

BiMap : jdk的map一般是通过key检索value,如果反查的话,最简单的就是构造另一个同步的map把value存成key,而BiMap支持双向检索,通过reverse反转关系。

Table : 支持二维索引的Map,比如我们有个Map<String,Map<String,Integer>>,通过两个字符串定位int,使用起来很麻烦,Table支持row和column的概念,在横“向”和“纵向”两个纬度来索引。

RangeSet : 区间型的集合,比如想得到一个1~100的数字的集合,最简单的做法就是for循环100次然后put进容器。rangeset支持add(range.open(1,100))这样类似php range()函数一样。

ListenableFuture : jdk提供了一个java.util.concurrent.Future的异步操作,可以非阻塞的执行一个Runable任务,但Future有一个问题,必须同步的调用get()取等结果或者直接获得结果,在逻辑上还是需要同步的操作,ListenableFuture通过addListener()的方式直接“回调”实现的方法,可以做到完全异步。

StringJoiner : 如果用过python的同学,应该很喜欢字符串的join()函数,实现字符串的按规律拼接。如

[java] view plain copy print ?
  1. Joiner.on("#").skipNulls().join("a","b","c");// 返回"a#b#c"
Joiner.on("#").skipNulls().join("a","b","c");// 返回"a#b#c"

Hashing : 如果用过Java自带的MD5的同学,经常看到比较繁琐的代码,导入security下好多包,然后静态初始化,然后getInstance获得算法实例。而Guava的md5非常干净,只需要:

[java] view plain copy print ?
  1. Hashing.md5().newHasher().put("123123123");
Hashing.md5().newHasher().put("123123123");

BloomFilter : 布隆过滤,可通过设置希望的准确率,数据总量来初始化 :

[java] view plain copy print ?
  1. BloomFilter<Person> bf = BloomFilter.create(object, 500, 0.01);// 0.01为可能错误判断的概率
BloomFilter<Person> bf = BloomFilter.create(object, 500, 0.01);// 0.01为可能错误判断的概率

EventBus : 接口简单的pub/sub的只需要一个register和Subcribe的注解即可。

3、还有一个Google的common框架不得不提,就是Google的依赖注入(Dependency Injector)框架Guice,这是个Google正在大规模使用的lib。主要提供代码级的依赖注入和AOP切面。

Apache的Spring可谓是DI的经典之作,但由于其功能太多,而且和ssh框架绑定比较多,如果只使用DI和AOP,那么还是推荐大家使用Guice。而且Guice不像Spring是用xml来描述,是通过注解来注入,所以做到了动态注入(代码可控)。给出一个DI的例子:

[java] view plain copy print ?
  1. public class HelloWorld implements HelloWorld {
  2. @Override
  3. String sayHello() {return "hello world";}
  4. }
public class HelloWorld implements HelloWorld {@OverrideString sayHello() {return "hello world";}
}
[java] view plain copy print ?
  1. @ImplementedBy(HelloWorldImpl.class)
  2. public interface HelloWorld {
  3. String sayHello();
  4. }
@ImplementedBy(HelloWorldImpl.class)
public interface HelloWorld {String sayHello();
}
[java] view plain copy print ?
  1. Injector inj=  Guice.createInjector();
  2. HelloWorld hw = inj.getInstance(HelloWorld.class);
  3. System.out.println(hw.sayHello());

转载至;http://blog.csdn.net/gugemichael/article/details/8701150

转载于:https://my.oschina.net/xiaominmin/blog/1597948

common,Google Guava,Guice相关推荐

  1. 【编程实践】Google Guava 极简教程

    前言 Guava 工程包含了若干被 Google 的 Java 项目广泛依赖 的核心库,我们希望通过此文档为 Guava 中最流行和最强大的功能,提供更具可读性和解释性的说明. 适用人群 本教程是基础 ...

  2. [Google Guava] 11-事件总线

    原文链接 译文连接 译者:沈义扬 传统上,Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的.设计EventBus就是为了取代这种显示注册方式,使组件间有了更好的解耦.EventBus ...

  3. [Google Guava] 9-I/O

    原文链接 译文链接 译者:沈义扬 字节流和字符流 Guava使用术语"流" 来表示可关闭的,并且在底层资源中有位置状态的I/O数据流.术语"字节流"指的是Inp ...

  4. [Google Guava] 10-散列

    原文链接 译文链接 译者:沈义扬 概述 Java内建的散列码[hash code]概念被限制为32位,并且没有分离散列算法和它们所作用的数据,因此很难用备选算法进行替换.此外,使用Java内建方法实现 ...

  5. [Google Guava] 7-原生类型

    原文链接 译文链接 译者:沈义扬,校对:丁一 概述 Java的原生类型就是指基本类型:byte.short.int.long.float.double.char和boolean. 在从Guava查找原 ...

  6. Java内存缓存-通过Google Guava创建缓存

    谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...

  7. epyc rome_使用Encog,ROME,JSoup和Google Guava进行博客分类

    epyc rome 继续进行编程收集情报 ( Programming Collection Intelligence ,PCI),下一个练习是使用距离得分根据相关博客中使用的单词来确定博客列表. 我已 ...

  8. 正则表达式 guava_带有正则表达式模式的Google Guava Cache

    正则表达式 guava 最近我看到了一个关于Google Guava的不错的介绍 ,我们在我们的项目中得出结论,使用它的缓存功能真的很有趣. 让我们看一下regexp Pattern类及其编译功能 . ...

  9. 谷歌guava_使用Google Guava进行馆藏创建和不变性

    谷歌guava 因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型. 如果您没有看过我以前的文章,则可能要从这里开始: 番石榴第1部分– MultiMaps 番石榴第2部分– ...

  10. 使用Encog,ROME,JSoup和Google Guava进行博客分类

    继续使用Programming Collection Intelligence (PCI),下一个练习是使用距离得分根据相关博客中使用的单词确定博客列表. 我已经找到Encog作为AI /机器学习算法 ...

最新文章

  1. 使用logrotate管理nginx日志文件
  2. activity使用dialog主题
  3. USB协议基础知识笔记
  4. 月薪40K的推荐算法工程师,需要具备怎样的技能?
  5. c#滚动条创建实例,多线程
  6. C#(Sharp)GDI plus与图形编程(计算机图形学必备知识)
  7. java if 赋值语句_Java中有一种特殊的赋值运算叫做三元运算,它和if-else语句类似....
  8. Apollo通过客户端openApi方式更新、获取、发布配置
  9. 手把手带你深入解析静态分派 动态分派原理 | 原力计划
  10. 华为HCC2014的变与不变
  11. HTTP 传输内容的压缩
  12. 产品上线过程中犯下的错误
  13. 算法:求刚好大于当前数组组合Next Permutation
  14. 计算机excel必备知识,excel常用函数大全
  15. matlab prn文件,PRN格式文件 如何打开PRN文件 PRN是什么格式的文件 用什么打开 - The X 在线工具...
  16. Easy2d 文档教程之 Visual Studio 安装 Easy2D 游戏引擎
  17. 【有限元分析】有限元仿真分析与解析解的结果对比——以阶梯轴的静力分析为例
  18. 图神经网络(一)图信号处理与图卷积神经网络(4)图滤波器
  19. 1.4418不锈钢规范及使用环境详解
  20. Longitudinal Statistics 纵向统计分析

热门文章

  1. Ajax控件之ScriptManager与UpdatePanel用法 by:凉游浅笔深画眉 / Net7Cracker
  2. SSH访问远程主机超时问题解决
  3. [转载]Unity3D 访问Access数据库
  4. Linux登录时执行
  5. .NET :在Visual Studio的不同Tab之间切换
  6. Apisonic Labs Speedrum Mac - MPC风格虚拟鼓采样器
  7. 关于Mac能连上Wi-Fi但无法上网的问题?方法来啦
  8. Android中Activity出现与退出的自定义动画
  9. 504 Gateway Time-out 错误处理记录
  10. react-router中进行路由控制