2024年Clojure现状调查!中分享您的想法。

欢迎!有关如何使用本服务的更多信息,请参阅关于页面。

+3
Java互操作

问题
- 许多Java API依赖于扩展抽象基类而不是接口
- "proxy"有局限性(无法访问受保护的字段或超类)
- "proxy"因为多一层函数/参数装箱等,所以性能开销较大
- "gen-class"功能复杂,并与编译/字节码生成相关

总结:Clojure目前还没有一个好的/方便的方法来动态扩展Java抽象基类。

提议创建一个“reify”的变体,允许扩展单个抽象基类(可选地还可以扩展接口/协议)。代码生成将在Java中直接扩展抽象基类的情况下发生(即具有对受保护成员的完全访问权限,并且具有完全类型提示的字段)。

由于这是一个仅适用于JVM的结构,因此它不应影响Clojure的可移植扩展方法(deftype等)。我们建议将其放入独立的命名空间中,这可能成为其他JVM特定互操作功能的家,例如“clojure.java.interop”

建议解决方案: 附加补丁提出了该功能的实现方案,提供一个包含defclassextend-class宏的clojure.interop命名空间。

`
(defclass name [fields*] options super-class super-args specs)

clojure.core/deftype类似,但可以扩展具体类,覆盖
和调用在超类或
其基类中定义的公共和受保护方法,并访问/设置这些的公共和受保护字段。
super-args是一个(可能为空)向超类构造函数传递的参数向量

构造函数的参数
可以通过的类型提示参数this为超类来调用重写的方法:(.(^SuperClass this method args*))

(extend-class options super-class super-args specs)
clojure.core/reify类似,可以扩展具体类,覆盖
`

并将参数this作为超类:(.(^SuperClass this method args*))

补丁: 0001-CLJ-1225-add-defclass-extend-class-v2.patch
和调用在超类或
其基类中定义的公共和受保护方法,并访问/设置这些的公共和受保护字段。
super-args是一个(可能为空)向超类构造函数传递的参数向量

构造函数的参数
可以通过的类型提示参数this为超类来调用重写的方法:(.(^SuperClass this method args*))

(extend-class options super-class super-args specs)
请求

jira

+1

5 个答案

评论:由 bronsa 提出

附上为此功能提出的方案

5 个答案

评论:由 bronsa 提出

更新的补丁与 v1 相同,但在 master 之上进行了更新

5 个答案
参考:[https://clojure.atlassian.net/browse/CLJ-1255](https://clojure.atlassian.net/browse/CLJ-1255)(由 mikera 报告)
我正在开发能从中真正受益的代码。
我们对这个想法很感兴趣,并且已经多次浏览了这张工单。但这里修改编译器的补丁方法比我们希望的更具有侵略性。自从我上次讨论这个问题已经有一段时间了,所以我记不起很多细节。
0

评论:由 alexmiller 提出

从 Rich 的回复:我们不希望在可移植构造(reify,deftype)中支持抽象类。但是,这将被视为一个新的仅限 Java 的构造(extend-class 或 reify-class)。如果您能适当修改工单,我们会将其退回到已分拣状态。

0

评论:由 bronsa 提出

有关所提议实现的更多文档可在此处找到:https://docs.google.com/document/d/1OcewjSpxmeFRQ3TizcaRRwlV34T8wl4wVED138FHFFE,非压缩提交:https://github.com/clojure/clojure/compare/master...Bronsa:defclass

...