java - উপস - বায়ু দূষণের কারণ ও ফলাফল




Varargs পরামিতি মাধ্যমে সম্ভাব্য গাদা দূষণ (4)

Varargs একটি অ-প্যারামিটারিজেড বস্তু অ্যারের সঙ্গে বলা হচ্ছে বিকল্প কারণ কারণ। সুতরাং যদি আপনার টাইপ <A> ... তালিকা ছিল, এটি তালিকা [] অ-varargs টাইপ সহ বলা যেতে পারে।

এখানে একটি উদাহরণ:

public static void testCode(){
    List[] b = new List[1];
    test(b);
}

@SafeVarargs
public static void test(List<A>... a){
}

আপনি তালিকাটি দেখতে পারেন [] b কোনও ধরণের গ্রাহক থাকতে পারে এবং এখনো এই কোডটি সংকলন করে। আপনি Varargs ব্যবহার করেন, তাহলে আপনি ভাল, কিন্তু আপনি টাইপ-erasure - অকার্যকর পরীক্ষা (তালিকা []) পরে পদ্ধতি সংজ্ঞা ব্যবহার করতে হলে - কম্পাইলার টেম্পলেট পরামিতি ধরনের পরীক্ষা করবে না। @ সাফভারগারস এই সতর্কতা দমন করবে।

আমি জাভা 7 দিয়ে জেনারিক টাইপ সঙ্গে Varargs ব্যবহার করার সময় এই বোঝা;

কিন্তু আমার প্রশ্ন হল ..

যখন এটি "এটির ব্যবহার সম্ভাব্য হিপকে দূষিত করতে পারে?"

এবং

নতুন @SafeVarargs কীভাবে বাধা দেয়?


আপনি যখন ঘোষণা

public static <T> void foo(List<T>... bar) কম্পাইলার এটি রূপান্তরিত

public static <T> void foo(List<T>[] bar) তারপর

public static <T> void foo(List[] bar)

তখন বিপদ দেখা দেয় যে আপনি ভুলভাবে তালিকাতে ভুল মান নির্ধারণ করবেন এবং কম্পাইলার কোনও ত্রুটি ট্রিগার করবে না। উদাহরণস্বরূপ, যদি T একটি String তবে নিচের কোডটি ত্রুটি ছাড়াই কম্পাইল হবে তবে রানটাইম এ ব্যর্থ হবে:

// First, strip away the array type (arrays allow this kind of upcasting)
Object[] objectArray = bar;

// Next, insert an element with an incorrect type into the array
objectArray[0] = Arrays.asList(new Integer(42));

// Finally, try accessing the original array. A runtime error will occur
// (ClassCastException due to a casting from Integer to String)
T firstElement = bar[0].get(0);

আপনি যদি এই ধরনের দুর্বলতাগুলি না @SafeVarargs তা নিশ্চিত করার পদ্ধতিটি পর্যালোচনা করেন তবে সতর্কতা দমন করতে আপনি @SafeVarargs সাথে এটিকে টীকা দিতে পারেন। ইন্টারফেসের জন্য, @SuppressWarnings("unchecked") ব্যবহার @SuppressWarnings("unchecked")

যদি আপনি এই ত্রুটি বার্তা পেতে:

Varargs পদ্ধতি অ-reifiable varargs পরামিতি থেকে হিপ দূষণ হতে পারে

এবং আপনি নিশ্চিত যে আপনার ব্যবহার নিরাপদ, তারপরে আপনাকে @SuppressWarnings("varargs") ব্যবহার করতে হবে। এই পদ্ধতির জন্য উপযুক্ত @ @ Safeguarargs দেখুন ? এবং https://.com/a/14252221/14731 এই দ্বিতীয় ধরনের ত্রুটির একটি চমৎকার ব্যাখ্যা করার জন্য।

তথ্যসূত্র:


হিপ দূষণ একটি প্রযুক্তিগত শব্দ। এটি এমন রেফারেন্সগুলিকে বোঝায় যা এমন একটি প্রকারের যা তারা নির্দেশ করে এমন বস্তুর সুপারটিপাইপ নয়।

List<A> listOfAs = new ArrayList<>();
List<B> listOfBs = (List<B>)(Object)listOfAs; // points to a list of As

এটি "unexplainable" ClassCastException গুলি হতে পারে।

// if the heap never gets polluted, this should never throw a CCE
B b = listOfBs.get(0); 

@SafeVarargs প্রতিরোধ করে না। যাইহোক, এমন পদ্ধতি রয়েছে যা হিপকে দূষিত করবে না, কম্পাইলার এটি প্রমাণ করতে পারে না। পূর্বে, যেমন APIs এর কলকারীরা বিরক্তিকর সতর্কতাগুলি পেতে পারে যা পুরোপুরি নিরর্থক ছিল কিন্তু প্রতিটি কল সাইটটিতে দমন করা হতো। এখন এপিআই লেখক ঘোষণা সাইটে একবার এটি দমন করতে পারেন।

তবে, যদি পদ্ধতিটি আসলে নিরাপদ না হয় তবে ব্যবহারকারীদের আর সতর্ক করা হবে না।


@SafeVarargs এটি ঘটতে বাধা দেয় না, তবে এটি ব্যবহার করে এমন কোডটি কম্পাইল করার সময় কম্পাইলার কঠোর হয়।

http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html ভবিষ্যতে বিস্তারিত এ ব্যাখ্যা করে।

হিপ দূষণ হল যখন আপনি একটি জেনারিক ইন্টারফেসে অপারেশন করার সময় ClassCastException পান এবং এটি ঘোষণা করার চেয়ে অন্য কোনও প্রকারের থাকে।





variadic-functions