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.

  • Kotlin - "No me importa" en desugaring de la class de datos
  • =? UTF? Q? Cadena de grupos de noticias de ASCII a Unicode
  • java.lang.ClassNotFoundException: com.intellij.junit5.JUnit5IdeaTestRunner usando spek en kotlin
  • El operador "si" de Elvis en Kotlin como argumento pnetworkingeterminado de la function
  • ¿Cómo interactúa Kotlin con Java y JavaScript?
  • ¿Cómo puedo refactorizar una vista para permitir el filtrado de elementos vinculados a un observable ArrayList dentro de una aplicación tornadofx?
  • ¿por qué la llamada a setText () en un OnFocusChangeListener limpia el text en la vista?
  • Kotlin con Spring DI: la propiedad lateinit no se ha inicializado
  • ¿Por qué mi compilation Kotlin falla utilizando Kotlin-Maven-Plugin?
  • Kotlin getParcelableArray del set de bashs no puede convertirlo en tipo personalizado
  • Pasar datos a un BroadcastReceiver desde un PendingIntent (AlarmManager)