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

前言

Kafka作为一个开源高性能消息引擎服务,也被评为21世纪最具影响力的技术进步之一。
近期在读Kafka源码过程中,发现了很多闪光点,也许我们平时工作不需要Kafka的源码,甚至压根用不到Kafka来实现功能。
但是这样一个优秀设计的分布式中间件,在代码的编写上有着很好的示范作用。本系列也希望摘取一些平凡中带着优雅的代码设计,来分享给大家,也请多多交流指教。

源代码

在初始化KafkaProducer或者KafkaConsumer时,都会携带java.util.Properties参数,而这些参数会被转化成java.util.Map,来一起看看Kafka中是怎么实现的。

先来看一遍实现方法org.apache.kafka.common.utils.UtilspropsToMap方法。

/**
     * 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
     */
    public static Map<String, Object> propsToMap(Properties properties) {
        Map<String, Object> map = new HashMap<>(properties.size());
        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
            if (entry.getKey() instanceof String) {
                String k = (String) entry.getKey();
                map.put(k, properties.get(k));
            } else {
                throw new ConfigException(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代码,其实这些编程思想在大多数语言中是通用的。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值