【问题标题】:Make a class that extends a class with overriding in clojure创建一个类,该类扩展一个在 clojure 中覆盖的类
【发布时间】:2016-07-25 16:53:20
【问题描述】:

我有非常简单的 java 代码:

public class MessageListenerExample extends ListenerAdapter
{
    @Override
    public void onMessageReceived(MessageReceivedEvent event)
    {
        // do something with event
    }
}

但是,我似乎无法理解如何将该代码转换为 clojure 代码。文档和文章非常混乱。我也很乐意看到更多的例子。我也有兴趣使用implements

【问题讨论】:

    标签: java oop clojure jvm


    【解决方案1】:

    您可以使用proxy 来扩展现有的Java 类并实现接口。例如:

    (import '[java.awt.event ActionListener ActionEvent KeyAdapter KeyEvent])
    
    (def listener
      (proxy
        ;; first vector contains superclass and interfaces that the created class should extend/implement
        [KeyAdapter ActionListener]
        ;; second vector contains arguments to superclass constructor
        []
        ;; below are all overriden/implemented methods
        (keyPressed [event]
          (println "Key pressed" event))
        (actionPerformed [action]
          (println "Action performed" action))))
    
    (.keyPressed listener nil)
    ;; => Key pressed nil
    
    (.actionPerformed listener nil)
    ;; => Action performed nil
    

    【讨论】:

      【解决方案2】:

      根据您需要做什么,有几个选项:

      1. 如果您确实需要在 Clojure 中扩展一个类(Object 除外),那么您可以使用 gen-class 来完成,请参阅 https://clojuredocs.org/clojure.core/gen-class。最好使用ns宏,比如
      (ns your.class.Name
          :extends whatever.needs.to.be.Extended)
      
      (defn -methodYouOverride   ; mind the dash - it's important
          [...] ...)
      

      除非绝对必要,否则我不建议走这条路。正确编译(包括 AOT 编译)很棘手。最后你仍然需要使用 Java 互操作来处理这个类的对象,所以不确定这是否值得,这让我想到:

      1. 用 Java 编写代码并使用 Java 互操作来处理它。

      2. 如果你真的需要创建一个对象的实例来实现某个接口,那么就更简单了:

      (reify
         InterfaceYouImplement
         (methodYouImplement [..] ..)
      

      我在我的代码中使用它,它真的比用 Java 编码好得多。

      【讨论】:

        【解决方案3】:

        只需自己实现EventListener,而不是使用那里的适配器类来使java程序员更方便(但让clojure程序员更难!)。您将收到一个 Event 对象,您可以自己检查它是否是 MessageReceivedEvent 的实例,就像适配器 would do for you 一样。

        在 Clojure 中实现接口是通过 reify 完成的 - 请参阅 https://stackoverflow.com/a/8615002/625403 以获取示例。

        【讨论】:

          猜你喜欢
          • 2019-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-21
          • 1970-01-01
          • 2018-03-15
          • 1970-01-01
          相关资源
          最近更新 更多