2017-08-22 1 views
4

Code droit:Dans quelle situation val/var est-il nécessaire dans le paramètre constructeur de Kotlin?

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) 
    } 
} 

ne peut pas être résolu le code:

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

La seule différence est le "val" a été supprimé et ne peut pas être résoudre.

Ce qui pourrait être important est que c'est une classe interne.

MAIS

Celui-ci classe sans "val/var" dans le paramètre constructeur fonctionne:

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) 
} 

}

Et si j'ajoute var/val avant « file d'attente: RequestQueue ", je vais avoir une suggestion:

" Le paramètre Constructeur n'est jamais utilisé comme propriété moins. rapports d'inspection paramètres de constructeur primaire qui peuvent avoir 'val' ou 'var' enlevé. l'utilisation non nécessaire de « val » et « var » dans le constructeur primaire consomme de la mémoire inutile. »

Je suis tout confus à ce sujet.

Répondre

1

paramètres du constructeur doivent utiliser var ou val quand ils sont utilisés comme propriété ailleurs dans le . classe, ils ne doivent pas nécessairement être des propriétés si elles ne sont utilisées que pour l'initialisation de la classe

dans ce cas, le paramètre doit être une propriété (var ou val) parce qu'il est utilisé dans une méthode:.

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

Dans ce cas, le paramètre est utilisé uniquement pour initialiser la classe, donc il n'a pas besoin d'être une propriété:

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

Lorsque vous écrivez val/var dans le constructeur, il déclare une propriété à l'intérieur de la classe. Lorsque vous ne l'écrivez pas, il s'agit simplement d'un paramètre transmis au constructeur principal, où vous pouvez accéder aux paramètres du bloc init ou l'utiliser pour initialiser d'autres propriétés. Par exemple,

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

paramètre Constructor est jamais utilisé comme une propriété

Cette suggestion dit que vous ne l'utilisez pas cette propriété en place en dehors de l'initialisation. Ainsi, il vous suggère de supprimer cette propriété de la classe.