पृष्ठभूमि
बिट इनपुट स्ट्रीम बाइट्स की एक सरणी द्वारा समर्थित है। वहाँ कई विधियाँ हैं जो उस बाइट सरणी से विभिन्न समन्वित आदिम सरणियों में पढ़ती हैं।
मुसीबत
डुप्लिकेट कोड है। जावा में आदिम प्रकारों में जेनरिक का अभाव है, इसलिए शायद पुनरावृत्ति अपरिहार्य है।
कोड
निम्न विधियों में दोहरावदार कोड स्पष्ट है:
@Override
public long readBytes(final byte[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readByte(bits);
}
return position() - startPosition;
}
@Override
public long readShorts(final short[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readShort(bits);
}
return position() - startPosition;
}
ध्यान दें कि कैसे final byte[] out
संबंधित है readByte(bits)
बस के रूप में final short[] out
संबंधित है readShort(bits)
। ये संबंध समस्या की जड़ हैं।
सवाल
एक महत्वपूर्ण प्रदर्शन हिट (जैसे, ऑटोबॉक्सिंग द्वारा) किए बिना दोहराव को कैसे समाप्त किया जा सकता है?
सम्बंधित
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
हाँ। (आमतौर पर यह एक समस्या नहीं है, क्योंकि एक कार्यक्रम के लिए कुछ अलग-अलग प्राइमेटिक्स से अधिक की आवश्यकता होना दुर्लभ है। आप क्लास के अंदर प्राइमेटिव्स लगाकर और ऑब्जेक्ट सीरियलाइज़ेशन का उपयोग करके इसे "ठीक" भी कर सकते हैं, हालांकि यह अपेक्षाकृत धीमी गति से हो सकता है। )
ByteBuffer
तरीकों का उपयोग करना asDoubleBuffer()
या बंद करना asShortBuffer()
होगा। docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
List<int>
२-५ वर्षों में रिलीज होना। इसे प्रोजेक्ट वल्लाह कहा जाता है।