Intereting Posts
Требуется ли знание Groovy для понимания Gradle? Требуется <Объект> и найден <Объект>? Kotlin – свойство должно быть инициализировано или быть абстрактным, даже если есть функция init () Kotlin: Оператор '==' не может применяться к 'kotlin.Int' и 'Person?' ошибка указать класс Kotlin как точку входа Main-Class в MANIFEST.MF? BottomNavigationView ссылку на ViewPager, когда я установил Listener в bottomNavigationView, мне нужно дважды щелкнуть, чтобы выполнить то, что я делаю Android Studio не выполняет рефакторинг «только для чтения» kapt сгенерированный код runOnUiThread не вызывает Обновление Kotlin от 1.0.2 до 1.0.3: java.lang.NoSuchMethodError: виртуальный метод не предоставленInjectedData $ app_compileDebugKotlin () Android Studio 3.0 Canary 1: тесты Kotlin или тесты Java, относящиеся к классам Kotlin, не работают Отладка встроенных функций Kotlin Китгер 2 не распознает метод предоставления в Котлине. Java отлично работает Kotlin – Как сделать поле только для чтения для внешних классов BDD на Android с Kotlin Не удается отправить многостраничные данные / данные формы с помощью Volley

Kotlin – Фабричный класс со свойствами

Я пытаюсь написать фабричный класс в Котлине. В 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; } } 

И я столкнулся с несколькими проблемами, пытающимися переписать это в Котлине. Я попытался сгенерировать код сначала с помощью конвертера Java на try.kotlinlang.org. Результат:

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

Я использую IntelliJ IDEA 15, и он говорит, что у этого класса нет метода getInstance() , но когда я пытаюсь его реализовать, он говорит:

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

Насколько я помню, геттеры автоматически реализованы только в классах данных. Может кто-нибудь прояснить эту ситуацию или, может быть, сказать мне правильный способ, как это реализовать? ОБНОВИТЬ:
Я использую этот класс в Котлине, ссылаясь на сами свойства, например. MyFactory.instance !!. FirstInstance, но это неправильно делать так.

Объяснение следующее:

Компилятор Kotlin создает геттеры и сеттеры для всех свойств, но они видны только на Java. В Kotlin свойства являются идиоматическими, и они даже генерируются из пары getter и setter Java при использовании классов Java.

Таким образом, объявление метода getInstance действительно сталкивается с автогенерированным getter, который будет отображаться в Java-коде .

Если вам требуется пользовательское поведение, используйте синтаксис getter:

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

В этом примере field является мягким ключевым словом и означает поле поддержки для свойства.

Это описано здесь .

Кстати, объявление объекта, похоже, хорошо подходит вашему делу.