मुझे विभिन्न आदिम प्रकारों पर एल्गोरिदम करने की आवश्यकता है; एल्गोरिदम अनिवार्य रूप से वही है जो चर के प्रकार के अपवाद के साथ समान है। तो उदाहरण के लिए,प्राचीन प्रकार के साथ काम करते समय पुनरावृत्ति से कैसे बचें?
/**
* Determine if <code>value</code> is the bitwise OR of elements of <code>validValues</code> array.
* For instance, our valid choices are 0001, 0010, and 1000.
* We are given a value of 1001. This is valid because it can be made from
* ORing together 0001 and 1000.
* On the other hand, if we are given a value of 1111, this is invalid because
* you cannot turn on the second bit from left by ORing together those 3
* valid values.
*/
public static boolean isValid(long value, long[] validValues) {
for (long validOption : validValues) {
value &= ~validOption;
}
return value == 0;
}
public static boolean isValid(int value, int[] validValues) {
for (int validOption : validValues) {
value &= ~validOption;
}
return value == 0;
}
मैं इस पुनरावृत्ति से कैसे बच सकता हूं? मुझे पता है कि आदिम सरणी उत्पन्न करने का कोई तरीका नहीं है, इसलिए मेरे हाथ बंधे हुए लगते हैं। मेरे पास आदिम सरणी के उदाहरण हैं और नंबर ऑब्जेक्ट्स के बॉक्स किए गए सरणी नहीं हैं, इसलिए मैं उस मार्ग को भी नहीं जाना चाहता हूं।
मुझे पता है कि एरे, ऑटोबॉक्सिंग इत्यादि के संबंध में प्राइमेटिव के बारे में बहुत सारे प्रश्न हैं, लेकिन मैंने इसे इस तरह से तैयार नहीं देखा है, और मैंने बातचीत करने के तरीके पर निर्णायक उत्तर नहीं देखा है इन सरणी के साथ।
मैं मैं की तरह कुछ कर सकता है लगता है:
public static<E extends Number> boolean isValid(E value, List<E> numbers) {
long theValue = value.longValue();
for (Number validOption : numbers) {
theValue &= ~validOption.longValue();
}
return theValue == 0;
}
और फिर
public static boolean isValid(long value, long[] validValues) {
return isValid(value, Arrays.asList(ArrayUtils.toObject(validValues)));
}
public static boolean isValid(int value, int[] validValues) {
return isValid(value, Arrays.asList(ArrayUtils.toObject(validValues)));
}
कि हालांकि वास्तव में काफी बेहतर है? इस तरह मूल कार्यान्वयन की तुलना में बहुत अधिक वस्तुएं पैदा होंगी, हालांकि यह स्रोत कोड को डीआरवाई करता है। इस मामले में किसी भी विचार की सराहना की जाएगी।
शानदार सवाल। यद्यपि मैं जेनेरिक के साथ ऐसा करने का कोई तरीका नहीं देख सकता, पूरी तरह से असंबंधित नोट पर, 1.5 सिंटैक्स में पुनरावृत्ति को प्रबंधित करने के तरीके के कारण, मुझे लगता है कि आप प्रत्येक नंबर के लिए ऑटोबॉक्सिंग कर रहे हैं। मुझे लगता है कि पुराने स्टाइल सरणी गिनती करने के लिए यह तेज़ होगा। –
@ I82Much: यहां मेरा जवाब और टॉम हौटिन द्वारा टिप्पणी देखें: http://stackoverflow.com/questions/2337170/managing-highly-repetitive-code-and-documentation-in-java मूल रूप से कोई "आसान" तरीका नहीं है। आपको या तो पुनरावृत्ति की पागल राशि से निपटना होगा या कस्टम प्री-प्रोसेसर या सोर्स-कोड इंस्ट्रूमेंटेशन या कुछ टेम्पलेटिंग सिस्टम का उपयोग करना होगा। तथ्य यह है कि यहां तक कि सूर्य ऐसी तकनीक का उपयोग कर रहा है साबित करता है कि इसका उपयोग है। असल में यह भी है कि अद्भुत ट्रोव प्राइमेटिव संग्रह यह कैसे कर रहा है। Polygenelubricants के सवाल और मेरे +5 ऊपर उल्लिखित/स्वीकार्य उत्तर देखें। – SyntaxT3rr0r