Maneras de ofuscar el acceso a miembros de la class preferentemente privados, pero en realidad públicos, con el fin de utilizarlos en methods en línea

¿Cuáles son algunas forms de ofuscar o limitar el acceso a los miembros públicos de una class?

La motivación para hacer esto es que me gustaría poder poner en inline un método, pero necesita acceso a otros miembros de la class, lo que requiere que sean public , sin embargo, preferiría que estos miembros no fueran public , pero desde deben ser public , estoy buscando forms de ofuscar o limitar el acceso a ellos.

Aquí hay un ejemplo de un caso en el que preferiría que preferablyPrivateLock fuera privado:

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

PD. Sé que esto parece un mal layout de OO; Espero que esta pregunta no me cueste ninguna reputación …

Lo mismo se puede hacer sin la Unit haciendo que el método sea una extensión de su propia class, en este caso SomeClass . Esto simplifica el uso:

 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 } } 

Esta solución fue mencionada por @Kirill en Kotlin Slack. Es una técnica similar a esta: en Kotlin, ¿cómo agrego los methods de extensión a otra class, pero solo visibles en un cierto context?

Aquí hay una manera de ofuscar el acceso a preferablyPrivateLock con la ayuda de extensiones :

 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() } } }