আদিম ধরণের সম্পর্কিত কোডটির সদৃশতা এড়াতে কীভাবে?


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()অফলোড করবে) code docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
মার্কস স্পেস

1
নোট করুন যে জাভাতে আদিম জেনেরিক সমর্থন আনার জন্য কিছু প্রচেষ্টা রয়েছে, যেমন List<int>ইত্যাদি 2-2 বা তার বেশি বছরের মধ্যে মুক্তি পেতে পারে। একে প্রকল্প ভালহাল্লা বলা হয়।
জাবুজার্ড

উত্তর:


2

আপনার কোডের মতো বাল্ক আদিম পড়তে থাকলে মনে হয়, বাই ডাবলবার ( যেমন ডাবলবাফার () বা এসআর্টবার্ফার () এর মতো বাইটবফার পদ্ধতিগুলি নিম্নোক্ত স্তরের কিছু কাজ অফলোড করবে।

উদাহরণ:

   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);
}

এই অনুলিপিটি কিছু পারফরম্যান্স, সংকলন-সময়ের ধরণের সুরক্ষার সামান্য অভাব এবং প্রতিবিম্বের ব্যবহারের ভিত্তিতে সম্বোধন করা হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.