java - 有没有办法在 clojure 中拥有真正的私有(private)函数?

标签 java clojure

正如所讨论的here ,私有(private) clojure 函数并不是真正私有(private)的,只是隐藏的。我不喜欢这个。在java中,标记为私有(private)的函数不能在类外部调用而不引发编译错误。有什么方法可以确保我声明为私有(private)的方法确实是私有(private)的,因为没有其他人可以调用它们?有什么方法至少可以模拟这个吗?

最佳答案

为了保持术语的正确性,Java 8 有 java.util.function.Function,但我认为您实际上指的是 java 方法。 Clojure 函数(实现 clojure.lang.IFn 接口(interface)的类)不是方法,而是类。 IFn 扩展了 RunnableCallable 接口(interface)。

严格来说,您实际上可以通过实现词法闭包来相当深地隐藏 Clojure 函数,这样就没有可访问的对象来公开它。

例如:

(ns my.hidden)

(fn not-here
   [x]
   (println "this can never be called"))

没有代码可以调用此函数。这个函数是如此隐藏,以至于垃圾收集器可能会在创建完成后立即将其从虚拟机中删除。当然这根本没有用。

一个更现实的例子(但仍然是你可能不应该做的事情):

(ns my.discreet)

(letfn [(a [x] (println "a with" x))
        (b [x] (println "b with" x))]
   (defn foo [x]
      (if (> (rand) 0.5)
             (a x)
            (b x))))

这里,调用者没有方便的方法直接访问 a 或 b。这可以通过反射实现,但只能通过利用 Clojure 版本的已知实现细节来实现。没有 API,因此任何解决方案都依赖于实现。引用一位 Clojure 开发人员的话:“这就是对实现细节的滥用,如果我这样做的话,我会睡不着觉”。

但这里重要的是,隐藏函数实际上并不是 Clojure 惯用的正确方法。在 Clojure 中,当我们想要进行防御性编码时,我们更喜欢依靠不可变的数据类型,以确保无知或恶意的编码者不会导致无效状态,因为我们不依赖状态突变来实现我们的算法。

关于java - 有没有办法在 clojure 中拥有真正的私有(private)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25335357/

相关文章:

java - 类路径包含多个 SLF4J 绑定(bind)(找不到)

java - Spring中如何使用泛型?

clojure - 我可以在没有 lein run 的情况下运行我的命令吗?

java - 在框架上启动键绑定(bind)

clojure - ClojureScript 中的 getElementsByClassName?

java - libgdx教程: cannot open desktop application

java - 从多个 Activity 向单个 Activity 发送额外内容

Java DecimalFormat - linux 中不正确的数字格式

clojure - 如何检查函数是否是部分函数?

clojure - 在 'for' 内使用 'let' 返回 HashMap 列表