2016-07-20 21 views
2

私はKotlinでデータクラスを使用して、それ以外の方法で記述しなければならないJavaコードの量を大幅に減らしています。Kotlinデータクラスのスーパークラスコンストラクタを呼び出す前の関数へのアクセス

しかし、私のJavaクラスの1つでは、私はKotlinで同じ結果を達成するために何をすべきか分かりません。私はKotlinでそれを書き換えることを試みてきたが、これまでのところ、私はこれを持って

public class DataObject { 

    private int mId; 
    private String mName; 

    public DataObject(int id, String name) { 
     mId = id; 
     mName = name; 
    } 

    public DataObject(Context context, int id) { 
     mId = id; 
     Cursor cursor = ... 
     cursor.moveToFirst(); 
     mName = cursor.getString(...); 
     cursor.close(); 
    } 

    public int getId() { 
     return mId; 
    } 

    public String getName() { 
     return mName; 
    } 

} 

data class DataObject(val id: Int, val name: String) { 

    constructor(context: Context, id: Int) : this(id, fetchName(context)) 

    private fun fetchName(context: Context): String { 
     val cursor = ... 
     cursor.moveToFirst() 
     val name = cursor.getString(...) 
     cursor.close() 
     return name 
    } 

} 

しかし、私のIDE(アンドロイドメーカー

私のJavaクラスは、ビットのようになります

)私は fetchName(context)私の constructor赤で部分を強調しています。それは、次のメッセージが表示されます。

は、スーパークラスのコンストラクタの前fetchNameにアクセスすることはできませんどのように私はこの問題を解決する必要があります

と呼ばれてきましたか?

+0

注 – voddan

+0

@voddan私はそうのような別のFactoryを使用したいです'データクラス'のように 'data'ですか?何故なの? –

+0

あなたの最初のJavaクラスは 'toString'または' equals'を持っていません、そうですか?したがって、 'data'を追加すれば、kotlinのバージョンはもっと多くなります。それについては何も悪いことではありませんが、何かを書き留めてください;) – voddan

答えて

6

メンバ関数は、完全に構築されたオブジェクトに対してのみ使用できます。私はCursorを使用してconstructorため少しも重い仕事であると思いますが、

private fun Context.fetchName(): String { 
    ///... 
    return cursor.getString(1) 
} 

data class DataObject(val id: Int, val name: String) { 
    constructor(context: Context, id: Int) : this(id, context.fetchName()) 
} 

:それを回避するために 一つの方法は、名前を取得するために、民間extension functionまたは単に機能を使用することです。

data class DataObject(val id: Int, val name: String) { 
    object FromCursorFactory { 
     fun create(id: Int, context: Context): DataObject { 
      val name = context.fetchName() 
      return DataObject(id, name) 
     } 
    } 
} 

さらに読書:あなたは本当にここ `data`を必要としない

+0

ありがとうございました。ちょっと別の簡単な質問がありました。私が拡張機能 'Context.fetchName()'をデータクラスに置くと、それでも警告が表示されましたが、データクラスの外に移動したときに警告が消えました。どうしてこれなの? –

+2

拡張機能がクラスに含まれている場合、それはまだ囲むクラスインスタンスのすべてのメンバーにアクセスできる関数なので、**インスタンス**が必要です。 – miensol

関連する問題