2016-11-12 11 views
6

मेरे पास जावा/कोटलिन इंटरऑप समस्या है। एक कोटलिन अपरिवर्तनीय सूची को सामान्य java.util.ArrayList में संकलित किया जाता है जो उत्परिवर्तनीय है!कोटलिन में एक अपरिवर्तनीय सूची कैसे बनाएं जो जावा में एक अपरिवर्तनीय सूची भी है?

Kotlin (पुस्तकालय):

class A { 
    val items: List<Item> = ArrayList() 
} 

जावा (उपभोक्ता):

A a = new A(); 
a.getItems().add(new Item()); // Compiles and runs but I wish to fail or throw 

कैसे मेरी Kotlin वर्ग पूरी तरह से जावा परिप्रेक्ष्य से भी अपरिवर्तनीय बनाने के लिए?

+0

मैं Kotlin से परिचित नहीं हूँ, लेकिन अमरूद जावा पुस्तकालय है जो आप रैप करने के लिए परिवर्तनशील 'ArrayList' इस्तेमाल कर सकते हैं एक' ImmutableList' प्रकार है। – pathfinderelite

+1

unmodifiableList (ArrayList()) –

+1

काम करता है। कृपया इसे उत्तर के रूप में पोस्ट करें। – WindRider

उत्तर

10

सभी गैर Mutable____ Kotlin में संग्रह संकलन समय केवल पढ़ने के प्रकार डिफ़ॉल्ट रूप से, लेकिन नहीं अपरिवर्तनीय हैं। निम्नलिखित कोड का टुकड़ा देखें:

fun main(args: Array<String>) { 
    // Explanation for ArrayList(listOf()) later down the post 
    val list: List<Int> = ArrayList(listOf(1, 2, 3)) 
    println(list) // [1, 2, 3] 

    // Fails at compile time 
    // list.add(4) 

    // Uh oh! This works at runtime! 
    (list as MutableList<Int>).add(4) 
    println(list) // [1, 2, 3, 4] 
} 

वास्तव में एक अपरिवर्तनीय सूची करवाने के लिए, अमरूद के Immutable____ संग्रह पर विचार करें:

import com.google.common.collect.ImmutableList 

fun main(args: Array<String>) { 
    val list: List<Int> = ImmutableList.of(1, 2, 3) 
    println(list) // [1, 2, 3] 

    // Fails at compile time 
    // list.add(4) 

    // Fails at runtime, as expected 
    (list as MutableList<Int>).add(4) 
    println(list) // [1, 2, 3, 4] 
} 

ध्यान रखें कि Kotlin के मानक क्रम समारोह के कुछ संग्रह है कि या तो unmodifiable हैं वापस आ सकते हैं, नहीं आकार बदलने योग्य, इत्यादि, इसलिए जब आप सीधे एक म्यूटेबल में केवल पढ़ने के लिए संग्रह डालते हैं तो सभी शर्त बंद हो जाती हैं।

उदाहरण के लिए, listOf() वर्तमान में (भविष्य में इसके लिए हो सकता है!) की ओर से एक java.util.Arrays.ArrayList vararg मापदंडों के सरणी के आसपास Arrays.asList(T...) के माध्यम से। यह "सूची" संशोधित की जा सकती है, लेकिन तत्वों को कभी भी जोड़ा या हटाया नहीं जा सकता है, क्योंकि आप किसी सरणी का आकार बदल नहीं सकते हैं। अधिक जानकारी के लिए Arrays.asList(T...) javadoc देखें।

यदि आप वास्तव में किसी दिए गए संग्रह से एक उत्परिवर्तनीय संग्रह चाहते हैं, तो .toMutableList() का उपयोग करके प्रतिलिपि बनाने पर विचार करें। यह किसी भी संग्रह पर काम करेंगे:

import com.google.common.collect.ImmutableList 

fun main(args: Array<String>) { 
    val list: List<Int> = ImmutableList.of(1, 2, 3) 

    val copy = list.toMutableList() 
    copy.add(4) 

    println(copy) // [1, 2, 3, 4] 
    println(list) // [1, 2, 3] 
} 
+0

एंड्रॉइड पर अमरूद से बचा जाना चाहिए। 'संग्रह .unmodifiableList()' सबसे सुरक्षित और सरल समाधान है। – WindRider

+0

@WindRider [गुवा का उपयोग एंड्रॉइड के साथ ठीक से किया जा सकता है] (http://stackoverflow.com/questions/14978699/is-it-a-good-idea-to-use-google-guava-library-for-android- विकास) लेकिन ProGuard की सिफारिश की है – kbolino

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