आदिम प्रकारों के बारे में कोड के दोहराव से कैसे बचें?


9

पृष्ठभूमि

बिट इनपुट स्ट्रीम बाइट्स की एक सरणी द्वारा समर्थित है। वहाँ कई विधियाँ हैं जो उस बाइट सरणी से विभिन्न समन्वित आदिम सरणियों में पढ़ती हैं।

मुसीबत

डुप्लिकेट कोड है। जावा में आदिम प्रकारों में जेनरिक का अभाव है, इसलिए शायद पुनरावृत्ति अपरिहार्य है।

कोड

निम्न विधियों में दोहरावदार कोड स्पष्ट है:

@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)। ये संबंध समस्या की जड़ हैं।

सवाल

एक महत्वपूर्ण प्रदर्शन हिट (जैसे, ऑटोबॉक्सिंग द्वारा) किए बिना दोहराव को कैसे समाप्त किया जा सकता है?

सम्बंधित


6
नहीं, आप वहां कुछ भी नहीं कर सकते। दोहराव ही एकमात्र विकल्प है।
एंडी टर्नर

एक तीसरे पक्ष के आदिम संग्रह का उपयोग करें
विन्स एमिग

1
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.हाँ। (आमतौर पर यह एक समस्या नहीं है, क्योंकि एक कार्यक्रम के लिए कुछ अलग-अलग प्राइमेटिक्स से अधिक की आवश्यकता होना दुर्लभ है। आप क्लास के अंदर प्राइमेटिव्स लगाकर और ऑब्जेक्ट सीरियलाइज़ेशन का उपयोग करके इसे "ठीक" भी कर सकते हैं, हालांकि यह अपेक्षाकृत धीमी गति से हो सकता है। )
अंक

3
इसके अलावा, (बस इसे याद किया जाता है) यदि आप थोक प्राइमेटिक्स पढ़ रहे हैं जैसे कि आपका कोड इंगित करता है, तो सबसे कम स्तर के काम के कुछ ByteBufferतरीकों का उपयोग करना asDoubleBuffer()या बंद करना asShortBuffer()होगा। docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
markspace

1
ध्यान दें कि जावा में आदिम जेनेरिक समर्थन को लाने के लिए कुछ प्रयास हो सकते हैं, अर्थात List<int>२-५ वर्षों में रिलीज होना। इसे प्रोजेक्ट वल्लाह कहा जाता है।
ज़बुज़ार्ड

जवाबों:


2

आप थोक पुरातन पढ़ रहे हैं अपने कोड, में इंगित करता है का उपयोग कर की तरह ByteBuffer तरह के तरीकों asDoubleBuffer () या (asShortBuffer) निम्नतम स्तर का कुछ कार्य ऑफलोड होगा।

उदाहरण:

   public void readBytes( final byte[] out, final int offset, final int count, final ByteBuffer buffer ) {
      buffer.get( out, offset, count );  // udates ByteBuffer `position` automatically
   }

   public void readShorts( final short[] out, final int offset, final int count, final ByteBuffer buffer ) {
      ShortBuffer sb = buffer.asShortBuffer();
      sb.get( out, offset, count );  // note that `count` reads two bytes for each `short`
   }

(कोड संकलन है, लेकिन परीक्षण नहीं किया गया है!)


0

एक संभावना, जो एक प्रदर्शन दंड को भड़काएगी, का उपयोग java.lang.reflect.Arrayसरणी को एक ऑब्जेक्ट के रूप में व्यवहार करने के लिए किया जाता है जो तब सभी पढ़ने के तरीकों में समान कोड का पुन: उपयोग करने की अनुमति देता है।

@FunctionalInterface
public interface BitArrayReader {
    Object read(int bits);
}

private long readPrimitive(
        final Object out, final int offset, final int count, final int bits,
        final BitArrayReader reader) {
    final int total = offset + count;

    assert out != null;
    assert total <= Array.getLength(out);

    final long startPosition = position();

    for (int i = offset; i < total; i++) {
        Array.set(out, i, reader.read(bits));
    }

    return position() - startPosition;
}

@Override
public long readBooleans(boolean[] out, int offset, int count, int bits) {
    return readPrimitive(out, offset, count, bits, this::readBoolean);
}

कुछ प्रदर्शन की कीमत पर दोहराव को संबोधित किया गया है, संकलन-समय सुरक्षा की एक मामूली कमी, और प्रतिबिंब का उपयोग।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.