方式混淆优先私人,但实际上是公共类成员的访问,为了在内联方法中使用它们
混淆或限制接触一个班级的公众成员的方法有哪些?
这样做的动机是我希望能够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() } } }