জেনারিক্স এবং টাইপ-ইরেজোর


10

জাভাতে জেনেরিকগুলি মুছে ফেলা টাইপ ব্যবহার করে প্রয়োগ করা হয়। জেএলএস বলছে যে অনুপ্রেরণা ছিল পশ্চাদপদ সামঞ্জস্য। অন্যদিকে যেমন সি # জেনেরিকগুলি পুনরায় সংশোধনযোগ্য।

তাত্ত্বিকভাবে জেনারিক্সকে "মুছে ফেলা" বা "পুনরায় সংশোধনযোগ্য" হিসাবে রাখার সুবিধা এবং অসুবিধাগুলি কী?

জাভা কি কিছু হারিয়েছে?

উত্তর:


8

ভাল, অনুপ্রেরণা (পিছনের সামঞ্জস্য) উভয় একটি সুবিধা এবং অসুবিধা। এটি অসুবিধে হয় কারণ আমরা সকলেই পুনরায় সংশোধনযোগ্য প্রকারগুলি পছন্দ করতে চাই তবে প্রদানের মূল্য বেশি ছিল। সি # তে নকশার পছন্দগুলি বিবেচনা করুন। তাদের পুনরায় সংশোধনযোগ্য প্রকার রয়েছে তবে এখন তাদের সদৃশ এপিআই রয়েছে। সুতরাং, একটি জাভা এপিআই কল্পনা করুন যেখানে আমাদের প্রতিটি প্যারামিটারাইজড শ্রেণীর জন্য নকল API রয়েছে। এখন নিজেকে উত্তরাধিকার শ্রেণি থেকে নতুন জেনেরিক ক্লাসে কয়েক হাজার লাইনের কোডের পোর্টিং করুন picture এখন, কে ডুপ্লিকেট API গুলি অসুবিধা বিবেচনা করবেন না? তবে ওহে, তাদের পুনরায় সংশোধনযোগ্য প্রকার রয়েছে!

সুতরাং, প্রধান প্রেরণা ছিল "বিপ্লব নয়, বিপ্লব"। এবং যৌক্তিকভাবে, প্রতিটি সিদ্ধান্তের বাণিজ্য রয়েছে।

উল্লিখিত অন্যান্য অসুবিধাগুলির পাশাপাশি, আমরা এও যুক্ত করতে পারি যে টাইপ ইরেজরের সংকলনের সময়টি যুক্তিযুক্ত হওয়া কঠিন হতে পারে, যেহেতু নির্দিষ্ট প্রকারগুলি সরানো হবে তা পরিষ্কার নয় এবং এর ফলে ত্রুটিগুলি খুঁজে পাওয়া খুব অদ্ভুত এবং শক্ত হয়ে যায় to

ব্রিজ পদ্ধতির অস্তিত্ব (বাইনারি সামঞ্জস্য রাখতে এই সংকলক সিন্টেক্সিকভাবে উত্পন্ন পদ্ধতিগুলি) অসুবিধা হিসাবেও দেখা যায়। এবং এগুলি পূর্ববর্তী অনুচ্ছেদে উল্লিখিত ত্রুটিগুলির একটি কারণ অবিকল হতে পারে।

বড় অসুবিধাগুলি ইতিমধ্যে স্পষ্ট সত্য থেকে উদ্ভূত যে জেনেরিক ধরণের জন্য একক শ্রেণি নেই এবং একাধিক শ্রেণি নেই। অন্য একটি উদাহরণ হিসাবে বিবেচনা করুন যে একই জেনেরিক শ্রেণি সহ একটি পদ্ধতি ওভারলোডিং জাভাতে ব্যর্থ হয়:

public void doSomething(List<One>);
public void doSomething(List<Two>);

এমন কিছু যা পুনরায় সংশোধনযোগ্য প্রকারের অসুবিধা হিসাবে দেখা যেতে পারে (কমপক্ষে সি # তে) এটি কোড বিস্ফোরণ ঘটায় । উদাহরণস্বরূপ List<int>একটি শ্রেণি, এবং একটি List<double>অন্যরকম একেবারে আলাদা, কারণ এটি a List<string>এবং a List<MyType>। সুতরাং ক্লাসগুলি রানটাইম হিসাবে সংজ্ঞায়িত করতে হবে, ক্লাসগুলির একটি বিস্ফোরণ ঘটায় এবং মূল্যবান সংস্থানগুলি উত্পন্ন করার সময় সেগুলি গ্রহণ করে।

new T()অন্য একটি জবাতে জাভাতে কোনও সংজ্ঞা দেওয়া সম্ভব নয় এই বিষয়টি সম্পর্কে , এটি কেবল আকর্ষণীয় বিষয় মুছে ফেলার বিষয় নয় তা বিবেচনা করাও আকর্ষণীয়। এটি একটি ডিফল্ট নির্মাণকারীর অস্তিত্বও প্রয়োজন, এজন্য সি # এর জন্য "নতুন বাধা" প্রয়োজন requires (দেখুন, কেন নতুন টি () জাভাতে সম্ভব নয় , অ্যালেক্স বাকলির দ্বারা)।


3
আমার মনে হয় আমি সিএলআর তে ঠিক বলেছি রেফারেন্স টাইপ T এর জন্য, আপনি Class<T>সকলের জন্য কোডের একটি অনুলিপি পাবেন T; প্লাস প্রতিটি ব্যবহৃত মূল্যের জন্য অতিরিক্ত ব্যবহৃত অনুলিপি T
আকাশম

@ আকাশম: সঠিক, জেনেরিক প্রতি একক রেফারেন্স টাইপ শ্রেণি রয়েছে, তবে প্রতিটি মান টাইপ তার নিজস্ব সংস্করণ তৈরি করে। প্রকারের ভিত্তিতে বিশেষ স্টোরেজ স্পেস সরবরাহ করার কারণে এটি রয়েছে, সমস্ত উল্লেখ একই স্টোরেজ গ্রহণ করে তবে মান প্রকারভেদে বিভিন্ন স্টোরেজ লাগে।
গুভান্তে

6

প্রকার মুছে ফেলার অসুবিধেটি হ'ল রানটাইমে জেনেরিকের ধরণটি আপনি জানেন না। এর থেকে বোঝা যায় যে আপনি তাদের প্রতিবিম্ব প্রয়োগ করতে পারবেন না এবং রান-টাইমে আপনি তা ইনস্ট্যান্ট করতে পারবেন না।

আপনি জাভাতে এর মতো কিছু করতে পারবেন না:

public class MyClass<T> {
    private T t;

    //more methods    
    public void myMethod() {
        //more code
        if (someCondition) {
            t = new T();//illegal
        } else {
            T[] array = new T[];//illegal
        }            
    }       
}

এটির জন্য একটি কার্যনির্বাহী কাজ রয়েছে তবে এর জন্য আরও কোড প্রয়োজন। আপনি যেমনটি উল্লেখ করেছেন সুবিধাটি হ'ল পিছনের সামঞ্জস্য।


3

মুছে ফেলা জেনেরিকের আরেকটি সুবিধা হ'ল যে বিভিন্ন ভাষা যা জেভিএম সংকলন করে তারা জেনেরিকের জন্য বিভিন্ন কৌশল প্রয়োগ করে, যেমন স্কেলার সংজ্ঞা-সাইট বনাম জাভা-এর ব্যবহার-সাইটের কোভারিয়েন্স। এছাড়াও স্কালার উচ্চতর ধরণের জেনেরিকগুলি। নেট এর রিফাইড প্রকারগুলিতে সমর্থন করা আরও বেশি কঠিন হত, কারণ মূলত স্কেল চালু রয়েছে C সি সি'র বেমানান সংশোধন ফর্ম্যাটটিকে অগ্রাহ্য করুন। আমরা যদি জেভিএম-এ জেনেরিকসকে সংশোধন করে থাকি তবে সম্ভবত স্কেল সম্পর্কে আমাদের সেই বৈশিষ্ট্যগুলি যথাযথভাবে পছন্দ করা উচিত নয় এবং আমরা সাবওটিমাল কিছুতে আটকে থাকতাম। ওলা বিনির ব্লগ থেকে উদ্ধৃত করে ,

এর অর্থ হ'ল আপনি যদি জেভিএম-তে সংশোধিত জেনেরিকগুলি যুক্ত করতে চান তবে আপনার খুব নিশ্চিত হওয়া উচিত যে প্রয়োগটি উভয় স্ট্যাটিক ভাষা যা জেনেরিকের নিজস্ব সংস্করণে উদ্ভাবন করতে চায় এবং যে সমস্ত গতিশীল ভাষা চায় তা অন্তর্ভুক্ত করতে পারে জাভা গ্রন্থাগারগুলির সাথে একটি ভাল বাস্তবায়ন এবং একটি দুর্দান্ত ইন্টারফেসিং সুবিধা তৈরি করুন। কারণ আপনি যদি এই মানদণ্ডগুলি পূরণ না করে এমন সংশোধিত জেনেরিকগুলি যুক্ত করেন তবে আপনি নতুনত্বকে আটকাবেন এবং একটি বহুভাষা ভিএম হিসাবে জেভিএমকে ব্যবহার করা এত বেশি শক্ত করে তুলবেন।

ব্যক্তিগতভাবে আমি TypeTagওভারলোডেড পদ্ধতিগুলির বিরোধিতা হিসাবে স্কালায় আবদ্ধ একটি প্রসঙ্গ ব্যবহারের প্রয়োজনীয়তাটিকে বিবেচনা করি না , কারণ এটি একটি প্রতিবিশ্বের (পুরো প্রোগ্রাম এবং সমস্ত সম্ভাব্য ভাষাগুলি) ভাষা থেকে ব্যবহারের সাইটে উন্নয়নের ওভারহেড এবং অবিচ্ছিন্নতা সরিয়ে দেয় moves সমস্যা যে শুধুমাত্র কম ঘন ঘন ক্ষেত্রে।



মুছে ফেলা জেনেরিকদের পক্ষে নেওয়ার আর একটি কারণ হ'ল নির্ভরতা এমনভাবে ইনজেকশন করা উচিত যা এক্সপ্রেশন সমস্যার সমাধানটিকে সম্মান করে। আপনি যদি নিজের জেনেরিক ফাংশনে নির্দিষ্ট কোনও প্রকারের জন্য বা কারখানার হার্ডকোডিংয়ের জন্য পরীক্ষা করছেন, তবে আপনি এক্সটেনসিবলটি ভুল করছেন।
শেলবি মুর III
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.