2017-11-17 6 views
1

私はAndroidでいくつかのアプリケーションを開発するためにKotlinを使っていましたが、現在、設定メソッドを呼び出さずに定義クラス内にフィールド値を設定します。ここでsetメソッドを呼び出さないフィールドの値を設定する - Kotlin

は私のクラス内のコードです:

var projectList: List<Project>? = null 
    set(value) { 
     saveProjects(value as ArrayList<Project>) 
     field = value 
    } 

//GO to the database and retrieve list of projects 
fun loadProjects(callback: Project.OnProjectsLoadedListener) { 
    database.projectDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(

        { success -> 
         callback.onProjectsLoaded(success) 
        //Here i don't want to save the projects, because i've loaded them from the database 
         this.projectList = success 
        }, 
        { error -> GenericErrorHandler.handleError(error,callback.retrieveContext())} 

        ) 
} 

誰でもset(value)メソッドを呼び出すことなく、これを行う方法を知っていますか?

+1

コンストラクタを使用しますか? – Zoe

+0

@Zoeここでどのように適用できるかわかりません。説明するケア? – Pavle37

+0

setメソッドを使用せずに値を設定したい場合や、変数を直接呼び出す場合(ゲッターとセッターを多かれ少なかれ同じように使用する場合)は、オブジェクトを作成するときに唯一のオプションです。したがって、コンストラクタ – Zoe

答えて

3

フィールドには、セッターから直接アクセスすることしかできません。セッターの内部では、フィールドには不可視のfield変数を使用してアクセスできます。

おそらくあなたの要件の周りにいくつかの他の方法があります。ここに2つの例があります。それらを正確にフォローする必要はありませんが、それらを組み合わせて、必要なソリューションを作成することもできます。

あなたはあなたの実際のプロパティのセッターとして機能する別のシェルのプロパティを使用できます。

class Example1 { 
    var fieldProperty: Int = 0 

    var setterPropertyForField: Int 
    get() = fieldProperty 
    set(value) { 
     fieldProperty = value 
    } 
} 

あなたはJVMフィールドとsetメソッドを使用すると、実際のJavaと同じようにセッターを使用することができます。 @JvmFieldはおそらく必要ありません。

class Example2 { 
    @JvmField var fieldProperty: Int = 0 

    fun setField(value: Int) { 
    fieldProperty = value 
    } 
} 

あなたはおそらく、フィールドにアクセスして、反射によってそれを変更するが、私はそのアプローチを推奨していませんでした。それはたぶん問題につながるだろう。

+0

JVMFieldアノテーションが働いていて、setterメソッドではなくフィールド自体にアクセスできるようにすると、すばらしいことになります。私はそのような答えを探しましたが、方法はありません。どうすればいいかの例を教えてくれてありがとう! :) – Pavle37

関連する問題