2016-04-07 13 views
14

क्यों Kotlin इस बारे में शिकायत करता है:चर 'runnable' प्रारंभ किया जाना चाहिए

class MyActivity : Activity { 
    private var handler:Handler = Handler() 

    private var runnable: Runnable = Runnable { 
    /* Do something very important */ 
    handler.postDelayed([email protected], 5000) 
    } 
} 

संकलक शिकायत लाइन में Variable 'runnable' must be initialized थे कि यह हैंडलर द्वारा फिर से पोस्ट किया जाता है। यह सादा जावा में काम करता है:

private Handler handler = new Handler(); 

private Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     handler.postDelayed(runnable, 5000); 
    } 
}; 
+1

उपयोग कर सकते हैं लिख सकते हैं आप इसे एक चक्रीय संदर्भ या कुछ और किया जा रहा है के बारे में चिंतित नहीं हैं? – AndroidEx

+0

क्या मुझे होना चाहिए? इसके पीछे विचार है कि इस रननेबल को प्रत्येक 5s निष्पादित किया जाना चाहिए। या मैं कुछ बहुत स्पष्ट याद कर रहा हूँ ?! – GeneralOfTheFelixLegions

उत्तर

13

Kotlin एक संपत्ति अप्रारंभीकृत समझता है अपने प्रारंभकर्ता के अंत तक, इसलिए यह अपने आप प्रारंभकर्ता अंदर नहीं किया जा सकता, यहां तक ​​कि lambdas में। यह अर्थशास्त्र local variable usage inside its initializer की सीमा के समान है।

कई संभावित हल कर रहे हैं:

  • उपयोग object expression जो आप संदर्भ घोषित वस्तु की this करने देता है:

    private var runnable: Runnable = object : Runnable { 
        override fun run() { 
         /* Do something very important */ 
         handler.postDelayed(this, 5000) 
        } 
    } 
    

    यह केवल lambdas के लिए एक स्थानापन्न के रूप में इंटरफेस के लिए अच्छी तरह से काम करता है और बहुत नहीं है पूरी तरह से सुंदर।

  • उपयोग lateinit var या एक delegated propertyDelegates.notNull() साथ:

    private lateinit var runnable: Runnable 
    init { 
        runnable = Runnable { 
         /* Do something very important */ 
         handler.postDelayed(runnable, 5000) 
        } 
    } 
    

    ही प्रारंभकर्ता इस घोषणा के साथ काम करेंगे:

    private var runnable: Runnable by Delegates.notNull() 
    
  • कार्यान्वित करके अपने दम पर self-reference for initializers का उपयोग करें:

    class SelfReference<T>(val initializer: SelfReference<T>.() -> T) { 
        val self: T by lazy { 
         inner ?: throw IllegalStateException("Do not use `self` until initialized.") 
        } 
    
        private val inner = initializer() 
    } 
    
    fun <T> selfReference(initializer: SelfReference<T>.() -> T): T { 
        return SelfReference(initializer).self 
    } 
    
    ,210

    और फिर आप की तरह

    private var runnable: Runnable = selfReference { 
        Runnable { 
         /* Do something very important */ 
         handler.postDelayed(self, 5000) 
        } 
    } 
    
+0

मुझे सही रास्ते पर रखने के लिए धन्यवाद। – tango24

1

कुछ तुम भी

private var runnable: Runnable = Runnable { 
    /* Do something very important */ 
    handler.postDelayed(runnable(), 5000) 
} 

private fun runnable() = runnable 
+0

फ़ंक्शन के बजाय आप केवल पढ़ने-योग्य संपत्ति का उपयोग कर सकते हैं: 'निजी वैल रननेबल कॉपी प्राप्त करें() = रननेबल – Heinrich

संबंधित मुद्दे