正如所讨论的here ,私有(private) clojure 函数并不是真正私有(private)的,只是隐藏的。我不喜欢这个。在java中,标记为私有(private)的函数不能在类外部调用而不引发编译错误。有什么方法可以确保我声明为私有(private)的方法确实是私有(private)的,因为没有其他人可以调用它们?有什么方法至少可以模拟这个吗?
最佳答案
为了保持术语的正确性,Java 8 有 java.util.function.Function
,但我认为您实际上指的是 java 方法。 Clojure 函数(实现 clojure.lang.IFn 接口(interface)的类)不是方法,而是类。 IFn
扩展了 Runnable
和 Callable
接口(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/