前言
Kafka作为一个开源高性能消息引擎服务,也被评为21世纪最具影响力的技术进步之一。
近期在读Kafka源码过程中,发现了很多闪光点,也许我们平时工作不需要Kafka的源码,甚至压根用不到Kafka来实现功能。
但是这样一个优秀设计的分布式中间件,在代码的编写上有着很好的示范作用。本系列也希望摘取一些平凡中带着优雅的代码设计,来分享给大家,也请多多交流指教。
源代码
在初始化
KafkaProducer
或者
KafkaConsumer
时,都会携带
java.util.Properties
参数,而这些参数会被转化成
java.util.Map
,来一起看看Kafka中是怎么实现的。
先来看一遍实现方法
org.apache.kafka.common.utils.Utils
类
propsToMap
方法。
/**
* Convert a properties to map. All keys in properties must be string type. Otherwise, a ConfigException is thrown.
* @param properties to be converted
* @return a map including all elements in properties
*/publicstaticMap<String,Object>propsToMap(Properties properties){Map<String,Object> map =newHashMap<>(properties.size());for(Map.Entry<Object,Object> entry : properties.entrySet()){if(entry.getKey()instanceofString){String k =(String) entry.getKey();
map.put(k, properties.get(k));}else{thrownewConfigException(entry.getKey().toString(), entry.getValue(),"Key must be a string.");}}return map;}
代码赏析
- 完美的javadoc注释!如果你也同我一样,接手过一些shi山代码,饱受折磨,相信看到这样一份注释也会泪流满面。当然,这段代码本身比较简单,只看名字就能知道作用。
Map<String, Object> map = new HashMap<>(properties.size())
: 允许的情况下,在新建ArrayList
,HashSet
,HashMap
等容器类时指定初始化容量,避免过小(默认10)导致扩容或者过大占用内存,这是我们常用的一项优化。if (entry.getKey() instanceof String)
:因为kakfa要求配置项key必须是字符串,因此提前判断类型,如果不满足直接抛出异常。这种提前判断可能发生的异常并主动抛出,也是我们编写健壮代码常用的手段。
总结
- 写好注释:作用,注意事项,异常条件。
- 注意性能优化,初始化容器类指定容量
- 注意提前判错,类型检查、空指针检查等
本次摘取的代码是一个简单的工具类,不包含业务逻辑。可是即便是这样简单的逻辑,在笔者的职业生涯中,也见过很多很多“老”选手仍然不注意这些问题。
不仅仅是Java代码,其实这些编程思想在大多数语言中是通用的。
版权归原作者 百里长庭 所有, 如有侵权,请联系我们删除。