Clases internas de Kotlin en Java visibles públicamente

Estoy desarrollando una biblioteca de cryptography Android en Kotlin. Tengo un par de classs internal que se hacen públicamente visibles en una aplicación Java. Encontrado esto en documentaciones.

internal declaraciones internal hacen public en Java. Los miembros de internal classs internal pasan por el cambio de nombre, para dificultar el uso accidental de Java y para permitir la sobrecarga de miembros con la misma firma que no se ven de acuerdo con las reglas de Kotlin;

¿Hay alguna forma de evitar esto?

    He visto que todas tus classs internas tienen que ver con encriptar y descifrar .

    puede hacerlo fácilmente definiendo una function de nivel superior y @JvmSynthetic como @JvmSynthetic , y luego hace que las classs ECryptSymmetricDecrypt y ECryptSymmetricEncrypt sean privadas para evitar que el cliente Java acceda a sus classs internas, por ejemplo:

     // define this top-level function in your ECryptSymmetricEncrypt.kt @JvmSynthetic internal fun <T> encrypt( input:T, password: String, cipher:Cihper, erl: ECryptResultListener, outputFile:File, getKey:(String,ByteArray)->SecretKeySpec){ ECryptSymmetricEncrypt(input, password, cipher, { pass, salt -> getKey(pass, salt) }, erl, outputFile) } 

    Sin embargo, resolvió su problema, pero aún quiero decir que su código se puede dividir en pequeños fragments. por ejemplo, el algorithm de encryption y desencryption tiene muchas duplicaciones, quizás pueda aplicar el Patrón de método de plantilla en su biblioteca de Cipher e introducir interfaces para hacer que su biblioteca sea explícita y oculte las operaciones de Cipher en las classs de implementación. Idealmente, el código del cliente no puede ver ninguna java.security.* través de las interfaces Encrypt o Decrypt . por ejemplo:

     interface Encrypt{ // v--- don't include the infrastructure class here,eg:`Keys`,`Cipher` fun encode(...args) } interface Decrypt{ // v--- don't include the infrastructure class here,eg:`Keys`,`Cipher` fun decode(...args) } 

    Y es algo malo que crees una instancia y calcules el resultado en el bloque de init aquí .

    Y puede usar Factory Method Pattern para evitar el tipo de comprobación tanto en las classs ECryptSymmetricDecrypt y ECryptSymmetricEncrypt .

    Además de @JvmSynthetic , puede usar @JvmName con un identificador Java ilegal, como agregar un espacio.

    Por ejemplo, agregué un espacio en @JvmName param, por lo que cualquier idioma, excepto Kotlin, no podrá invocar tu método:

     @JvmName(" example") internal fun example() { }