完全没有必要有很多不同的分派值。但有时候分派值并不是开发者所想的那样。
我在生产环境中偶然遇到一个使用关键字作为分派函数时的内存泄漏问题。我的本意是根据第一个参数中字段的值进行分派,但错误地当关键字未找到时,将关键字作为一个函数将多方法的第二个参数视为分派值。
以下是一个简单的示例:
```
(defmulti foo :type)
(defmethod foo :default [_ _] nil)
(foo {} (Math/random))
```
我的本意是
```
(defmulti foo (fn [x y]
(:type x)))
```
注意,我的有缺陷的代码并不会引起任何功能错误,仅仅是因为多方法的缓存机制导致内存泄漏。