关于clojure的gen-class

[b][size=large]关于gen-class的参数说明:[/size][/b]

:name aname
要生成的类的全限定名

:extends aclass
指定superclass,没有指定默认为Object

:implements [interface ...]
要实现的接口

:init name
指定构造函数名称,必须返回[ [superclass-constructor-args] state]
如果没有指定,则args传给superclass,并且state为nil

:constructors {[param-types] [super-param-types], ...}
指定构造参数的类型

:post-init name
init之后执行

:methods [ [name [param-types] return-type], ...]
定义开放的方法,默认为non-private方法,静态方法加^{:static true}。

:main boolean
指定的main方法。名称为(str prefix main)。prefix默认为减号。也可以自己指定prefix。

:factory name
工厂方法

:state name
存放的state的名称,state是ref或者agent类型。(对应于init中的state。必须要配置init)

:exposes {protected-field-name {:get name :set name}, ...}
暴露get,set方法

:exposes-methods {super-method-name exposed-name, ...}
需要暴露哪些方法

:prefix string
前缀,默认为减号。查找方法要以(str prefix fn-name)为准,所以main方法写成-main。可以认为是public的一个标识符。

:impl-ns name
指定实现方法的ns

:load-impl-ns boolean
默认为true,和impl-ns配套使用

[b][size=large]一个例子[/size][/b]

(ns com.example )

(gen-class
:name com.example.Demo
:state state
:init init
:prefix "-"
:main false
:methods [[setLocation [String] void]
[getLocation [] String]])

;;构造函数。state值为:(atom {:location "default"})
(defn -init []
[[] (atom {:location "default"})])

;;保存字段到state中
(defn setfield
[this key value]
(swap! (.state this) into {key value}))

;;从state中获取field
(defn getfield
[this key]
(@(.state this) key))

(defn -setLocation [this loc]
(setfield this :location loc))

(defn -getLocation
[this]
(getfield this :location))

;;main入口,可以在lein中配置:main参数,然后执行lein uberjar来打包一个可执行的jar包。
(defn -main [& args]
(pritnln "Hello,World!"))

;; 编译后,添加到classpath。当成java类来调用、执行。
user=> (def ex (com.example.Demo.))
#'user/ex
user=> (.getLocation ex)
"default"
user=> (.setLocation ex "time")
nil
user=> (.getLocation ex)
"time"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值