Конфигурируемый завод в Котлине для JavaScript

У меня есть класс Колина A, свойство которого либо предоставляется в основном конструкторе, либо создается заводом во вторичном конструкторе A.

interface I class O : I class A (val i: I) { constructor(): this(factory!!.create()) } interface Factory { fun create(): I } class MyFactory: Factory { override fun create(): I { return O() } } var factory: Factory? = null fun main(args: Array<String>) { factory = MyFactory() A() } 

Когда я компилирую этот код на JavaScript (Kolin Compiler версии 1.0.6-release-127) и запускаю его в браузере (Safari 10.0.3), я получаю следующую ошибку времени выполнения:

 ReferenceError:Can't find variable: tmp$0 

Ошибка возникает во вторичном конструкторе A. Кажется, что у Колина есть проблема при выполнении нулевой проверки параметра во вспомогательном конструкторе. Код работает правильно, когда я меняю заводскую декларацию на «не null» и удаляю инициализацию фабрики из метода main ():

 val factory: Factory = MyFactory() fun main(args: Array<String>) { A() } 

Но это не то, что я хочу, так как я хочу иметь возможность настроить фабрику во время запуска приложения.

Мне что-то не хватает, или это ошибка в компиляторе JavaScript Котлина? Кто-нибудь знает обходной путь для этой проблемы? Есть ли другой или лучший способ разработки настраиваемых фабрик в Котлине для JavaScript?

Сгенерированный код JavaScript:

 var KotlinTest = function (Kotlin) { 'use strict'; var _ = Kotlin.defineRootPackage(function () { this.factory = null; }, /** @lends _ */ { I: Kotlin.createTrait(null), O: Kotlin.createClass(function () { return [_.I]; }, function O() { }), A: Kotlin.createClass(null, function A(i) { this.i = i; }), A_init: function ($this) { $this = $this || Object.create(_.A.prototype); _.A.call($this, ((tmp$0 = _.factory) != null ? tmp$0 : Kotlin.throwNPE()).create()); return $this; }, Factory: Kotlin.createTrait(null), MyFactory: Kotlin.createClass(function () { return [_.Factory]; }, function MyFactory() { }, /** @lends _.MyFactory.prototype */ { create: function () { return new _.O(); } }), main_kand9s$: function (args) { _.factory = new _.MyFactory(); _.A_init(); } }); Kotlin.defineModule('KotlinTest', _); _.main_kand9s$([]); return _; }(kotlin); 

Отвечая на мой вопрос. Как правильно комментировал @marstran, это, похоже, является ошибкой в ​​компиляторе Javascript 1.0 в Kolin, который, похоже, исправлен в 1.1-бета-версии. Тем временем, я использую обходное решение, подобное следующему:

 interface I class O : I class A (val i: I) { constructor(): this(Factory.get().create()) } interface Factory { companion object { private var IMPL : Factory? = null fun get(): Factory = IMPL!! fun set(impl: Factory) { IMPL = impl } } fun create(): I } class MyFactory: Factory { override fun create(): I { return O() } } fun main(args: Array<String>) { Factory.set(MyFactory()) A() } 
Intereting Posts
Есть ли способ иметь постоянную постоянную файла в Kotlin Копирование документов KDoc с одного метода на другой Перекрестные ссылки в параметрах типа Создание класса Parcelable со вторичным конструктором, который принимает список как параметр в Kotlin Могу ли я создать KType из reified T Как читать и писать txt-файлы в android в kotlin Расширения Android Kotlin, пакеты не могут быть импортированы Как найти, какой элемент не удалось сравнить между массивами в Котлине? Идиоматический способ обращения с нулевым или пустым списком в Котлин Kotlin Vertx Тип Несоответствие найдено Future <Unit> ожидаемый обработчик <AsyncResult <Void >> Android: Kotlin: пользовательский webView – не может быть вызван как функция. Функция 'invoke ()' не найдена Как настроить пользовательский шрифт для приложения для Android? Создайте карту списков из Spring config в Kotlin Почему выражения лямбда ведут себя по-разному для классов Kotlin и Java? JaCoCo возвращается 0% Покрытие с Kotlin и Android 3.0