В какой ситуации 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) } } 

не может быть разрешен скриншот кода

Единственное различие заключается в том, что «val» был удален и не может быть разрешен.

Что может быть важно, так это то, что это внутренний класс.

НО

Этот один класс без «val / var» в параметре конструктора работает:

 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 / val перед «queue: RequestQueue», я получу предложение:

«Параметр конструктора никогда не используется как свойство меньше. В этой инспекции сообщаются параметры первичного конструктора, которые могут иметь« val »или« var ». Ненужное использование« val »и« var »в основном конструкторе потребляет ненужную память».

Я просто смущен.

Когда вы пишете val / var внутри конструктора, он объявляет свойство внутри класса. Когда вы его не пишете, это просто параметр, переданный первичному конструктору, где вы можете получить доступ к параметрам в блоке init или использовать его для инициализации других свойств. Например,

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

Параметр конструктора никогда не используется как свойство

Это предложение говорит о том, что вы не используете это свойство вместо инициализации. Таким образом, он предлагает вам удалить это свойство из класса.

Параметры конструктора должны использовать var или val когда они используются как свойство в другом месте класса. Они не должны быть свойствами, если они используются только для инициализации класса.

В этом случае параметр должен быть свойством ( var или val ), потому что он используется в методе:

 class A(val number: Int) { fun foo() = number } 

В этом случае параметр используется только для инициализации класса, поэтому он не должен быть свойством:

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