如何在clojure中参数化对Java枚举的访问?

sta*_*and 11 clojure clojure-java-interop

说我有一个Java枚举.例如:

public enum Suits {CLUBS, DIAMONDS, HEARTS, SPADES};
Run Code Online (Sandbox Code Playgroud)

通常情况下,我可以用这样的枚举做一些clojure:

(defn do-something []
   (let [s Suits/DIAMONDS] (...)))
Run Code Online (Sandbox Code Playgroud)

但是,我想编写一个clojure函数,允许调用者指定要使用的枚举实例:

(defn do-something-parameterized [suit]
   (let [s  Suits/suit] (...)))
Run Code Online (Sandbox Code Playgroud)

我们的想法是让呼叫者传递"DIAMONDS",并有DIAMONDS枚举实例获取绑定到slet.

我可以cond匹配参数,但这似乎比必要的笨拙.我想我也可以使用宏来构造Suits/添加到suit.这是做到这一点的方式还是有一种我失踪的非宏观方式?

Dav*_*Ray 14

无需反射或地图.每个Java枚举都有一个静态valueOf方法,可以按名称检索枚举值.所以:

(defn do-something-parameterized [suit]
  (let [s (Suit/valueOf (name suit))] ...))
Run Code Online (Sandbox Code Playgroud)

使用(name)允许使用字符串或关键字:

(do-something-parameterized "HEARTS")
(do-something-parameterized :HEARTS)
Run Code Online (Sandbox Code Playgroud)