2017-08-22 15 views
4

右コード: Kotlinのコンストラクタパラメータでval/varが必要な状況はありますか?

class MainActHandler(val weakActivity: WeakReference<Activity>): Handler() { 
    override fun handleMessage(msg: Message?) { 
     val trueAct = weakActivity.get() ?: return 
     if (msg?.what == ConversationMgr.MSG_WHAT_NEW_SENTENCE){ 
      val sentence = msg.obj as String? 
      trueAct.conversation.text = sentence 
     } 
     super.handleMessage(msg) 
    } 
} 

が解決することはできませんコード:

class MainActHandler(weakActivity: WeakReference<Activity>): Handler() { 
    override fun handleMessage(msg: Message?) { 
     val trueAct = weakActivity.get() ?: return 
     if (msg?.what == ConversationMgr.MSG_WHAT_NEW_SENTENCE){ 
      val sentence = msg.obj as String? 
      trueAct.conversation.text = sentence 
     } 
     super.handleMessage(msg) 
    } 
} 

cannot be resolved code screenshot

唯一の違いは、 "ヴァル" では削除されていて、解決することはできません。

重要なことは、それが内部クラスだということです。

class BookInfo(convrMgr: ConversationMgr, id: String, queue: RequestQueue, queueTag:String) { 

val TAG = "BookInfo" 
var title: String? = "" 

init { 
    val url = "https://api.douban.com/v2/book/$id" 
    // Request a string response from the provided URL. 
    val stringRequest = StringRequest(Request.Method.GET, url, 
      Response.Listener<String> { response -> 
       Log.d(TAG + " Response", response.substring(0)) 
       // Parse JSON from String value 
       val parser = Parser() 
       val jsonObj: JsonObject = 
         parser.parse(StringBuilder(response.substring(0))) as JsonObject 
       // Initial book title of book properties. 
       title = jsonObj.string("title") 
       Log.d(TAG + " Book title", title) 
       convrMgr.addNewMsg(title) 
      }, 
      Response.ErrorListener { error -> Log.e(TAG + " Error", error.toString()) }) 
    // Set the tag on the request. 
    stringRequest.tag = queueTag 
    // Add the request to the RequestQueue. 
    queue.add(stringRequest) 
} 

}

を私はキュー」の前にVAR /ヴァルを追加した場合:

しかし

コンストラクタパラメータで "ヴァルの/ var" なしのこの1クラスが働いています。 RequestQueue "、私は提案を得るでしょう:

"コンストラクタのパラメータはプロパティとして使われることはありません。インスペクションでは、 'val'または 'var'が削除された主なコンストラクタパラメータがレポートされます。不要な「ヴァル」の用法とプライマリコンストラクタの「VAR」不要なメモリを消費します。」

私はそれについてだけで混乱しています。彼らは他の場所でのプロパティとして使用されている場合

答えて

1

コンストラクタのパラメータはvarまたはvalを使用する必要があります。クラス彼らは唯一のクラスの初期化のために使用されている場合彼らは、プロパティである必要はありません

この場合、それは方法で使用されているため、パラメータは、プロパティ(varまたはval)でなければなりません:。。

class A(val number: Int) { 
    fun foo() = number 
} 
012この場合、

は、パラメータは、クラスを初期化するために使用されているので、それは財産である必要はありません:あなたは、コンストラクタ内val/varを書くとき、それはクラス内のプロパティを宣言し

class B(number: Int): A(number) { 
    init { 
     System.out.println("number: $number") 
    } 
} 
5

。これを記述しない場合は、それは単にプライマリコンストラクタに渡されるパラメータで、initブロック内のパラメータにアクセスするか、他のプロパティを初期化するために使用します。例えば、

class User(val id: Long, email: String) { 
    val hasEmail = email.isNotBlank() //email can be access here 
    init { 
     //email can be access here 
    } 
} 

コンストラクタのパラメータは、この提案は、あなたが初期から離れて所定の位置に、このプロパティを使用しないことを言っているプロパティ

として使用されることはありません。したがって、このプロパティをクラスから削除することをお勧めします。

関連する問題