2017-05-21 12 views
2

object宣言で私のandroid sqliteの移行を宣言しようとしています。それぞれはインターフェイスMigrationを拡張しています。オブジェクトであるMigratorオブジェクトを初期化するときに、それぞれ1つのオブジェクトを登録する必要があります。これもシングルトンです。残念ながら(私はこの遅れを認識しています)kotlinオブジェクトは遅れて初期化されるため、マイグレーションはどこかで自分自身を登録する必要があります。kotlinでオブジェクトを初期化しようとしていますか?

反射や注釈の使用を受け入れることはできますが、それが良いアイデアであるか、その方向に向かう大会に従う方法があれば、それは耐えられません。

+0

私はこれが良いとは思いませんアイディア。クラスを実際に使用せずに追加するだけで、コードの動作を変更してはいけません。代わりに手動でマイグレーションのリストを保持するか、マイグレーション・インターフェースを実装するenumクラスを作成することをお勧めします。 Enum.valuesを使用してすべての移行にアクセスできます。 –

+0

@ChristianBrüggemann一般的に私は同意しますが、私は単にクラスを実際にどこにも使用せずに追加するだけではありません。私はこれを行うinitialize/registerメソッドを明示的に呼び出しているので、Migrationが誤って登録されていないようにしたいと思っています。これは、何もしない完全に良い移行を書くよりも安全です。 – Catalyst

答えて

0

あなたはグローバル変数と式をオブジェクトへのオブジェクトの宣言から切り替えることができます回避策として:

イーガー:

val A = object { 
    init { println("eager") } 
} 

レイジー:

object A { 
    init { println("lazy") } 
} 
+3

これもうまくいきません。トップレベルの宣言を持つファイルは(通常はJVMで)遅延して初期化される 'FileNameKt'クラスに変換されます。 –

+0

@AlexeyAndreevこれは私がこれを試してみるものです。 – Catalyst

関連する問題