2016-01-03 5 views
2

Я пытаюсь написать фабричный класс в Котлине. В Java:Kotlin - класс фабрики со свойствами вопросов

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? 

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

ответ

3

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

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

Таким образом, объявление метода getInstance действительно противоречит auto-generated getter that will be visible in Java code.

Если вам нужно пользовательское поведение геттера используйте геттер синтаксис:

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

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

Документировано here.

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

+0

Спасибо за ваш ответ, так что MyFactory.instance в основном действительный метод get-accessor? –

+0

@ Илья Пузанов, пожалуйста. Да, компилятор Kotlin будет генерировать 'MyFactory.getInstance()' для Java, а в Kotlin 'MyFactory.instance' уже * получает * значение свойства. – hotkey

Смежные вопросы