Kotlin – Clase de fábrica con problemas de properties

Intento escribir classs de fábrica en Kotlin. En Java:

public class MyFactory { private static MyFactory instance = null; private Properties props = null; private FirstClass firstInstance = null; private SecondClass secondInstance = null; private MyFactory() { props = new Properties(); try { props.load(new FileInputStream("path/to/config")); String firstClass = props.getProperty(“first.class”); String secondClass = props.getProperty(“second.class”); firstInstance = (FirstClass) Class.forName(firstClass).newInstance(); secondInstance = (SecondClass) Class.forName(secondClass).newInstance(); } catch (Exception ex) { ex.printStackTrace(); } } static { instance = new MyFactory(); } public static MyFactory getInstance() { return instance; } public FirstClass getFirstClass() { return firstInstance; } public SecondClass getSecondClass() { return secondInstance; } } 

Y encontré algunos problemas para intentar reescribir esto en Kotlin. Intenté generar código primero con el convertidor de Java en try.kotlinlang.org. El resultado es:

 class MyFactory private constructor() { private var props: Properties? = null private var firstInstance: FirstClass? = null private var secondInstance: SecondClass? = null init { try { props!!.load(FileInputStream("path/to/conf")) val firstClass = props!!.getProperty("prop") val secondClass = props!!.getProperty("prop") firstInstance = Class.forName(firstClass).newInstance() as FirstClass secondInstance = Class.forName(secondClass).newInstance() as SecondClass } catch (ex: Exception) { ex.printStackTrace() } } companion object { var instance: MyFactory? = null init{ instance = MyFactory() } } } 

Estoy usando IntelliJ IDEA 15, y dice que esta class no tiene el método getInstance() , pero cuando bash implementarlo, dice:

  Platform declaration clash: The following declarations have the same JVM signature: fun <get-instance>(): my.package.MyFactory? fun getInstance(): my.package.MyFactory? 

Según recuerdo, los getters se implementan automáticamente solo en classs de datos. ¿Alguien puede aclarar esta situación o quizás decirme la forma correcta de implementar esto? ACTUALIZAR:
Hago uso de esta class en Kotlin al referirme a las properties en sí, ej. MyFactory.instance !!. FirstInstance, pero se siente mal hacerlo de esta manera.

La explicación es la siguiente:

El comstackdor de Kotlin crea getters y setters para todas las properties, pero solo son visibles en Java. En Kotlin, las properties son idiomáticas, e incluso se generan a partir del par getter y setter de Java cuando usas classs Java.

Por lo tanto, declarar un método getInstance choca con el getter autogenerado que será visible en el código Java .

Si necesita un comportamiento de captador personalizado, use la syntax getter:

 var instance: MyFactory? = null get() { /* do something */ return field } 

En este field ejemplo field es una palabra key suave y significa un campo de respaldo para la propiedad.

Está documentado aquí .

Por cierto, la statement de object parece ajustarse bien a su caso.

  • ¿Cómo se inyectan parameters de campo con nombre en Kotlin con Dagger 2?
  • Cómo arreglar "La característica no es parte del esquema para este Reino" en Kotlin Realm Extention
  • Kotlin ejecuta en Android Studio error prompt "Gradle sync failed: Tiempo de espera agotado de la connection: connect Consulte el logging de IDE para get más detalles (Ayuda | Mostrar logging)"
  • Anotación de Kotlin + Dagger2 @Named en el uso del método del proveedor del module
  • ¿Por qué tengo que devolver Unit.INSTANCE al implementar en Java una function Kotlin que devuelve una Unidad?
  • Cómo crear un grupo de subprocesss en Kotlin
  • arrayListOf y hashMapOf: reference no resuelta
  • Error de compilation después de actualizar a Android Studio 3.0 con Kotlin
  • Declaración de object global en kotlin
  • Este campo filtra un object de context
  • ¿Por qué AtomicInteger es abstracto en Kotlin? (funciona bien en Java)