方式混淆优先私人,但实际上是公共类成员的访问,为了在内联方法中使用它们

混淆或限制接触一个班级的公众成员的方法有哪些?

这样做的动机是我希望能够inline一个方法,但是需要访问其他成员,这需要他们是public ,但是我更喜欢这些成员是public ,但是自从他们必须是public ,我正在寻找方法混淆或限制访问他们。

这里是一个例子,我希望preferablyPrivateLock是私人的:

 class SomeClass { val preferablyPrivateLock = ReentrantLock() inline fun <R> fancyInlineFunction(function:()->R):R { preferablyPrivateLock.lock() try { return function() } finally { preferablyPrivateLock.unlock() } } } 

PS我知道这似乎是不好的OO设计; 希望这个问题不花我任何名誉…

同样的方法可以在没有Unit的情况下通过将方法扩展到自己的类(在这种情况下是SomeClass 。 这简化了用法:

 class SomeClass { private val preferablyPrivateLock = ReentrantLock() val SomeClass.hiddenLock: ReentrantLock get() = preferablyPrivateLock inline fun <R> fancyInlineFunction(function:()->R):R { with(this) { hiddenLock }.lock() try { return function() } finally { with(this) { hiddenLock }.unlock() } } } class OtherClass { fun foo() { val x = SomeClass().hiddenLock // ERROR: Unresolved reference hiddenLock } } 

@Kirill在Kotlin Slack中提到了这个解决方案。 这是类似的技术: 在Kotlin中,我如何将扩展方法添加到另一个类,但仅在特定的上下文中可见?

这里有一个方法来混合使用extensionsPrivateLock的访问 :

 class SomeClass { private val preferablyPrivateLock = ReentrantLock() val Unit.obfuscatedLock:ReentrantLock get() = preferablyPrivateLock inline fun <R> fancyInlineFunction(function:()->R):R { with(this) {Unit.obfuscatedLock}.lock() try { return function() } finally { with(this) {Unit.obfuscatedLock}.unlock() } } }