2017-05-23 13 views
2

コンテキストを持つKotlinのオブジェクトクラスにプロパティを持たせてもよろしいですか? Androidでは、コンテキスト関連のオブジェクトを静的フィールドに入れることは悪い習慣です。 Androidスタジオはそれを強調表示し、警告がないところのKotlinとは違って警告を出します。 例オブジェクト:Kotlinのオブジェクトフィールドにコンテキストを持つAndroidクラス

object Example { 
    lateinit var context: Context 

    fun doStuff(){ 
     //..work with context 
    } 
} 
+4

* Javaでは悪い習慣です*いいえ...それはKotlinでも悪いことを暗示するAndroid not javaに関連しています... – Selvin

+0

もさまざまなコンテキストがあります...アプリケーション、アクティビティ、Service ...アプリケーションのコンテクストを格納することは、アクティビティやサービスのコンテクストを格納するよりも「悪くない」(より良いことができますが、コンテキストリークは発生しません) – Selvin

+0

ええ、私の悪いです。それをAndroidに変更しました。 –

答えて

6

object Sはシングルトンであるので、それらは単一の静的インスタンスを有します。したがって、contextプロパティを指定した場合は、まだ静的な方法でContextを保存しています。

これは、Javaの静的フィールドにContextを置くのと全く同じ結果になります。


あなたはKotlinはJavaでobject用に生成同等のコードを記述する場合、それは実際に適切な糸くずのエラーになります:あなたは何の警告を取得されていません

public class Example { 

    // Do not place Android context classes in static fields; this is a memory leak 
    // (and also breaks Instant Run) 
    public static Context context; 

    // Do not place Android context classes in static fields (static reference to 
    // Example which has field context pointing to Context); this is a memory leak 
    // (and also breaks Instant Run) 
    public static Example INSTANCE; 

    private Example() { INSTANCE = this; } 

    static { new Example(); } 

} 
+0

しかし、なぜ警告がないのですか? –

+1

Googleが忘れたか、Kotlinの "オブジェクト"でこのような状況を見つけるのは難しいので...バグレポート – Selvin

+0

を記入してください。実際、彼らはおそらく、まだこのKotlinオブジェクトのためのこの糸くずチェックを追加していません。 – zsmb13

関連する問題