0


Kafka优雅源码设计1-Utils.propsToMap

前言

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代码,其实这些编程思想在大多数语言中是通用的。

标签: kafka java

本文转载自: https://blog.csdn.net/a9181454/article/details/123857729
版权归原作者 百里长庭 所有, 如有侵权,请联系我们删除。

“Kafka优雅源码设计1-Utils.propsToMap”的评论:

还没有评论