2015-05-20 7 views
6

मुझे म्यूटेबल सूची ऑब्जेक्ट को अपरिवर्तनीय सूची में परिवर्तित करने की आवश्यकता है, जावा में संभावित तरीका क्या है।जावा में अपरिवर्तनीय सूची कैसे बनाएं?

final class MutableClass{ 
final String name;  
final String address; 
final int age; 
MutableClass(String name, String address ,int age){ 
    this.name=name; 
    this.address=address; 
    this.age=age; 
} 
} 
+0

तुम वहाँ अपरिवर्तनीय नहीं है क्या है, क्योंकि आप बहुत आसानी से .add (ऑब्जेक्ट ओ) विधि को कॉल कर सकते हैं। ArrayList का उप-वर्ग बनाएं, .add (..) विधि को ओवरराइड करें और इसके पास या तो खाली कार्यान्वयन है, या एक अनचेक अपवाद फेंक दें। और, उस वर्ग के फाइनल बनाने के लिए, ताकि आप इसे उपवर्ग नहीं कर सकते हैं और कार्यान्वयन – Stultuske

+0

बदलते हैं, तो किसी अन्य वस्तु में सूची लपेटें सकता है और केवल लागू अपने प्रश्न का Iterable इंटरफ़ेस –

+3

उत्तर: http://stackoverflow.com/questions/10750791/क्या-है-भावना के- अंतिम ArrayList –

उत्तर

23

आप

beanList = Collections.unmodifiableList(beanList); 

कर सकते हैं जब आप beanList प्रारंभ है यह अपरिवर्तनीय बनाने के लिए -

public void action() { 

    List<MutableClass> mutableList=Arrays.asList(new MutableClass("san","UK",21),new MutableClass("peter","US",34)); 
    List<MutableClass> immutableList=immutateList(mutableList); 
} 

public List<MutableClass> immutateList(List<MutableClass> mutableList){ 
    //some code here to make this beanList immutable 
    //ie. objects and size of beanList should not be change. 
    //ie. we cant add new object here. 
    //ie. we cant remove or change existing one. 
} 

नीचे मेरी MutableClass है।

तुम दोनों आंतरिक तरीकों कि सूची को संशोधित सक्षम होना चाहिए, और जनता के तरीकों कि संशोधन की अनुमति नहीं होना चाहिए है, तो मैं आपको बस इतना

// public facing method where clients should not be able to modify list  
public List<Bean> getImmutableList(int size) { 
    return Collections.unmodifiableList(getMutableList(size)); 
} 

// private internal method (to be used from main in your case) 
private List<Bean> getMutableList(int size) { 
    List<Bean> beanList = new ArrayList<Bean>(); 
    int i=0; 

    while(i<size) { 
     Bean bean = new Bean("name"+i,"address"+i,i+18); 
     beanList.add(bean); 
     i++; 
    } 
    return beanList; 
} 

सुझाव देंगे (आपका Bean वस्तुओं पहले से ही अपरिवर्तनीय लग रहे हैं।)


में एक नोट के रूप में: आप जावा 8 उपयोग करने के लिए होता है, तो अपने getMutableList निम्न प्रकार से व्यक्त किया जा सकता:

return IntStream.range(0, size) 
       .mapToObj(i -> new Bean("name" + i, "address" + i, i + 18)) 
       .collect(Collectors.toCollection(ArrayList::new)); 
5

Collections.unmodifiableList() का उपयोग करें। आप अपने मूल ArrayList में पास करते हैं और यह एक सूची देता है जो अपवाद फेंकता है यदि आप तत्व जोड़ने, हटाने या बदलने का प्रयास करते हैं। उदाहरण के लिए, getImmutableList() के अंत में return beanList; के बजाय return Collections.unmodifiableList(beanList); का उपयोग करें। main() एक अपवाद फेंक देगा। Collections कक्षा में अन्य सभी सामान्य संग्रह प्रकारों के साथ-साथ सूची के अलावा विधियां भी हैं।

0

समाधान नीचे अपरिवर्तनीय के रूप में सूची बनाने के लिए किसी भी एपीआई का उपयोग कर के बिना के लिए है।

ArrayList सदस्य चर

public final class Demo { 

private final List<String> list = new ArrayList<String>(); 

public Demo() { 
    list.add("A"); 
    list.add("B"); 
} 

public List<String> getImmutableList() { 
    List<String> finalList = new ArrayList<String>(); 
    list.forEach(s -> finalList.add(s)); 
    return finalList; 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Demo obj = new Demo(); 
    System.out.println(obj.getImmutableList()); 
    obj.getImmutableList().add("C"); 
    System.out.println(obj.getImmutableList()); 
} 

}

तो वास्तविक सूची में परिवर्तन नहीं होगा साथ अपरिवर्तनीय वस्तु, हमेशा उत्पादन किया जाएगा [ए, बी]

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