मैं ऐसी स्थिति में हूं जहां मैं इंटीजर जैसी चीजों के परस्पर संस्करणों का उपयोग करना चाहता हूं। क्या मुझे इन वर्गों (नीचे) का उपयोग करना होगा या जावा में कुछ बनाया है?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
मैं ऐसी स्थिति में हूं जहां मैं इंटीजर जैसी चीजों के परस्पर संस्करणों का उपयोग करना चाहता हूं। क्या मुझे इन वर्गों (नीचे) का उपयोग करना होगा या जावा में कुछ बनाया है?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
n
कैलोरी ले जाने वाले भोजन के एक टुकड़े को संग्रहीत करना , जिसे कम किया जा सकता है / जोड़ा जा सकता है), उपयोग के नाम पर एक वर्ग का उपयोग करना बेहतर हो सकता है, (उदाहरण के लिए class FoodItem { int calories; }
, क्योंकि यह स्पष्ट है और विधियाँ हैं। अगर बाद में जरूरत हो तो जोड़ा जाए।
int
काम नहीं करता है जैसे कि अगर यह एक विधि में बढ़ा हुआ है तो मूल्य दूसरी विधि में परिलक्षित नहीं होगा।
जवाबों:
नहीं, जावा में ये बिल्ट इन नहीं हैं। और यह एक कारण के लिए है। उत्परिवर्तनीय प्रकारों का उपयोग करना खतरनाक है, क्योंकि वे आसानी से दुरुपयोग कर सकते हैं। इसके अतिरिक्त, इसे लागू करना वास्तव में आसान है। उदाहरण के लिए, कॉमन्स-लैंग में ए MutableInt
।
JDK के बाद से 1.5 जावा अब है java.util.concurrent.atomic.AtomicInteger
यह एक थ्रेड सेफ म्यूटेबल पूर्णांक है, उपयोग का उदाहरण:
final AtomicInteger value = new AtomicInteger(0);
फिर बाद में:
value.incrementAndGet();
यहाँ एक छोटा वर्ग है जिसे मैंने एक पूर्णांक पूर्णांक के लिए बनाया है:
public class MutableInteger {
private int value;
public MutableInteger(int value) {
this.value = value;
}
public void set(int value) {
this.value = value;
}
public int intValue() {
return value;
}
}
आप इसे आसानी से किसी अन्य आदिम तक बढ़ा सकते हैं। बेशक, जैसे हर कोई कह रहा है, आपको इसका उपयोग सावधानी से करना चाहिए।
MutableInteger
, MutableDouble
, MutableString
आदि लेकिन इसके बजाय एक Mutable<Integer>
, Mutable<Double>
... (का उपयोग करने का स्मृति भूमि के ऊपर Integer
से अधिक int
आम तौर पर खाते में गिर जाएगी। लेकिन आपको एक सिंगल मिलता है, क्लास का उपयोग करने के लिए तैयार, जो अधिकांश मामलों को संभाल सकता है (यदि आप चाहते हैं कि आपका पूर्णांक तुलनीय या इसी तरह की चीजें हैं जो आपको अभी भी उप-वर्ग की आवश्यकता हैं, हालांकि)।
आप किसी भी आदिम प्रकार के लिए एक उत्परिवर्ती वस्तु के रूप में एक nnnn [] का उपयोग कर सकते हैं जैसा कि @Alexandre से पता चलता है, जावा में AtomicInteger और AtomicLong भी है।
आईएमएचओ इंट आम तौर पर इंटेगर की तुलना में बेहतर विकल्प है और यह परिवर्तनशील है।
क्या आप इस बात का अधिक विवरण दे सकते हैं कि आपको एक उत्परिवर्ती वस्तु की आवश्यकता क्यों है, शायद उसी चीज को प्राप्त करने का एक और तरीका है।
int
हमेशा final
Integer a = 4;
तब a = 5;
मान्य कोड है, लेकिन Integer
परस्पर नहीं है।
Integer
उदाहरण परस्पर भिन्न नहीं हैं भले ही उनके संदर्भ हों, लेकिन यह एक अलग प्रकार है।
int
परस्पर भिन्न नहीं है क्योंकि यदि आप इसे किसी विधि में पास करते हैं, तो विधि के लिए इसके मूल्य को बदलने का कोई तरीका नहीं है और कॉलिंग विधि में परिलक्षित नया मान है
AtomicInteger
पहले ही उल्लेख किया जा चुका है। Mutable Double
s का अनुकरण किया जा सकता है AtomicReference<Double>
। पहले से उल्लिखित चेतावनी लागू होती है और यह खराब शैली है, लेकिन कभी-कभी आपके पास इस तरह का कोड होता है
double sum=0
for (Data data:someListGenerator())
sum+=data.getValue()
और कार्यात्मक जावा 8 शैली में इसे फिर से बनाना चाहते हैं। यदि कोड इस पैटर्न का अनुसरण करता है, लेकिन इसमें काफी जटिलता जोड़ता है, तो सबसे समझदार रूपांतरण हो सकता है
AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();
बेशक, यह कम से कम संदिग्ध शैली है। लेकिन मैंने खुद को एक स्थिति में एक बार से अधिक एक ResultSet
कंप्यूटिंग लूप के साथ मुड़ पाया और आंशिक रूप से तीन अलग-अलग सूचनाओं का संचयन किया। इससे कोड को उचित कार्यात्मक शैली में बदलना वास्तव में कठिन हो जाता है। उपरोक्त पैटर्न के अनुसार संचयी भागों को परिवर्तित करना मुझे साफ कोड और ओवरसिम्प्लीफाइड रिफैक्टरिंग के बीच एक उचित ट्रेडऑफ लगता था।
someStreamGenerator().mapToDouble(Data::getValue).sum()
। यहां तक कि तीन अलग-अलग informations के संचयन के लिए, उपयोग करके एक कार्यात्मक तरीका हैStream.reduce
याStream.collect
। मुझे हर लूप को कार्यात्मक कोड के टुकड़े में रिफलेक्टर करने का कोई कारण नहीं दिखता है, लेकिन यदि आप इस तरह से जाना चाहते हैं, तो आपको इसे अंत तक जाना चाहिए।
for
और foreach
जटिल रूपरेखाओं के हिस्से हो सकते हैं जो कार्यात्मक रूप से फिर से लिखे जाते हैं, इसलिए आपको बाकी कोड को किसी तरह उनके चारों ओर संरेखित करना होगा।
आप org.omg.CORBA पैकेज (या बस आपको जिस वर्ग की आवश्यकता है) आयात कर सकते हैं और इसमें आप होल्डर कक्षाओं का उपयोग कर सकते हैं।
उदाहरण के लिए, इसमें "IntHolder" है जहां यह पूर्णांक को संग्रहीत करने वाला क्षेत्र सार्वजनिक है, इसे संशोधित करने के लिए पहुंच प्रदान करता है।
public static void triple(IntHolder x){
x.value = 3 * x.value;
}
IntHolder mutableInt = new IntHolder(10);
triple(mutableInt);
System.out.println(mutableInt.value);
इसमें "लॉन्गहॉल्डर" और "डबलहॉल्ड" और अन्य के टन भी हैं जिनका आप उपयोग कर सकते हैं। सावधानी से प्रयोग करें।
यहाँ इसके लिए एपीआई है: https://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html