Java >> Java tutorial >  >> Tag >> public

Kotlin interne klasser i Java synlige offentligt

Jeg har set alle dine interne klasser handler om kryptering og dekryptering.

du kan gøre det nemt ved at definere en funktion på øverste niveau og markere den som @JvmSynthetic , og gør derefter klasserne ECryptSymmetricDecrypt og ECryptSymmetricEncrypt til private for at forhindre Java-klientadgang til dine interne klasser, for eksempel:

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

Det løste dog dit problem, men jeg vil stadig sige, at din kode kan brydes i små stykker som yderligere. for eksempel har krypterings- og dekrypteringsalgoritmen mange duplikationer, måske kan du anvende Template Method Pattern i dit krypteringsbibliotek og introducere grænseflader for at gøre dit bibliotek eksplicit og skjule Cipher operationer under implementeringsklasserne. Ideelt set kan klientkoden ikke se nogen java.security.* klasser via Encrypt eller Decrypt grænseflader. for eksempel:

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

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

OG det er en dårlig ting, at du opretter en instans og beregner resultatet i init blokere her.

OG du kan bruge Factory Method Pattern for at undgå typekontrol både i klasserne ECryptSymmetricDecrypt og ECryptSymmetricEncrypt.


Bortset fra @JvmSynthetic , kan du bruge @JvmName med en ulovlig Java-id, som f.eks. at tilføje et mellemrum.

Som et eksempel tilføjede jeg et mellemrum i @JvmName param, så alle sprog undtagen Kotlin vil ikke være i stand til at kalde din metode:

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

Java tag