জাভাতে সাপ্রেস ওয়ার্নিংস ("চেক না করা") কী?


443

কোডটি সন্ধান করার সময় আমি দেখতে পাই যে অনেকগুলি পদ্ধতি একটি টীকা নির্দিষ্ট করে:

@SuppressWarnings("unchecked")

এটার মানে কি?

উত্তর:


420

কখনও কখনও জাভা জেনেরিকগুলি আপনাকে যা করতে চান তা করতে দেয় না এবং আপনাকে কম্পাইলারকে কার্যকরভাবে বলতে হবে যে আপনি যা করছেন তা কার্যকর করার সময় আইনী হবে

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

একই জেনেরিক্স এফএকিউর এই বিষয়টিতে বেশ কয়েকটি বিভাগ রয়েছে, "" পরীক্ষা না করা "সতর্কতা কী?" - এটি পড়ার পক্ষে ভাল।


10
কিছু ক্ষেত্রে, আপনি আপনার ক্লেজ.ক্লাস.কাস্ট () ব্যবহার করে এড়াতে পারবেন। একক জেনেরিক উপাদান পাত্রে কাজ করে তবে সংগ্রহের জন্য নয়।
আকনারোকদ

অথবা পছন্দসইভাবে ওয়াইল্ডকার্ড জেনেরিক ব্যবহার করুন (YourClazz<?>)- জাভা কখনই এ জাতীয় কাস্টগুলি সুরক্ষিত থাকার বিষয়ে সতর্ক করে না। এটি সর্বদা তবে কাজ করবে না (বিশদগুলির জন্য জেনেরিক FAQ দেখুন)।
কনরাড বোরোস্কি

48

এটি চেক করা জেনেরিক ক্রিয়াকলাপগুলি (ব্যতিক্রম নয়), যেমন কাস্টস সম্পর্কে সতর্কতা সংকলন দমন করার জন্য একটি টীকা ation এটি মূলত ইঙ্গিত দেয় যে প্রোগ্রামার কোনও নির্দিষ্ট কোডের সংকলন করার সময় সে সম্পর্কে ইতিমধ্যে অবহিত সে সম্পর্কে সে সম্পর্কে অবহিত হওয়ার ইচ্ছা ছিল না।

আপনি এখানে নির্দিষ্ট টীকাটি সম্পর্কে আরও পড়তে পারেন:

SuppressWarnings

অতিরিক্তভাবে, ওরাকল এখানে টীকাগুলির ব্যবহার সম্পর্কে কিছু টিউটোরিয়াল ডকুমেন্টেশন সরবরাহ করে:

টীকা

তারা যেমন এটি রেখেছিল,

"জেনেরিক্সের আবির্ভাবের আগে লিখিত উত্তরাধিকারের কোডটি জেনারিক্স শিরোনামের পাঠ্যটিতে আলোচিত) সাথে ইন্টারফেস করার সময় 'চেক না হওয়া' সতর্কতাটি ঘটতে পারে" "


19

এর অর্থ এটিও হতে পারে যে বর্তমান জাভা টাইপ সিস্টেম সংস্করণটি আপনার ক্ষেত্রে যথেষ্ট ভাল নয়। এটি ঠিক করার জন্য বেশ কয়েকটি জেএসআর প্রস্তাব / হ্যাক ছিল: প্রকার টোকেন, সুপার টাইপ টোকেন , ক্লাস.কাস্ট ()।

আপনার যদি সত্যই এই দমন প্রয়োজন হয়, এটি যথাসম্ভব সঙ্কুচিত করুন (উদাহরণস্বরূপ এটি ক্লাসের মধ্যে বা একটি দীর্ঘ পদ্ধতিতে রাখবেন না)। একটি উদাহরণ:

public List<String> getALegacyListReversed() {
   @SuppressWarnings("unchecked") List<String> list =
       (List<String>)legacyLibrary.getStringList();

   Collections.reverse(list);
   return list;
}

10

SuppressWarning টীকা সটীক উপাদানের জন্য দমন কম্পাইলার সতর্কবার্তা করতে ব্যবহৃত হয়। বিশেষত, uncheckedবিভাগটি চেক না করা টাইপ কাস্টের ফলস্বরূপ উত্পন্ন সংকলক সতর্কতাগুলির দমন করতে দেয়।


আপনার সুপারস ওয়ার্নিং লিঙ্কটি মারা গেছে; এখানে একটি বিকল্প রয়েছে: ডকস.অরাকল.com
জেমস ডেইলি

8

সহজভাবে: এটি একটি সতর্কতা যার মাধ্যমে সংকলকটি নির্দেশ করে যে এটি ধরণের সুরক্ষা নিশ্চিত করতে পারে না।

উদাহরণস্বরূপ জেপিএ পরিষেবা পদ্ধতি:

@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
    Query query = entitymanager.createQuery("SELECT u FROM User u");
    return (List<User>)query.getResultList();
}

আমি যদি এখানে @ সাপ্রেস ওয়ার্নিংস ("চেক না করা") anotate না করে থাকি তবে লাইন নিয়ে এটির সমস্যা হবে, যেখানে আমি আমার রেজাল্টলিস্টটি ফিরে আসতে চাই।

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

আমি http://www.angelikalanger.com/ জেনারিক্স এফএকিউ / এফএকিউসেকশনস / ফান্ডামেন্টালস html এ নির্মাণ করি


2
আমাদের এমন অবস্থার জন্য যেখানে সপ্রেস ওয়ার্নিংগুলি ব্যবহার করা দরকার এটির একটি উত্তম উদাহরণ।
জিমি

8

জাভাতে, জেনেরিকগুলি মুছে ফেলার ধরণের মাধ্যমে প্রয়োগ করা হয়। উদাহরণস্বরূপ, নিম্নলিখিত কোড।

List<String> hello = List.of("a", "b");
String example = hello.get(0);

নিম্নলিখিতটি সংকলিত হয়।

List hello = List.of("a", "b");
String example = (String) hello.get(0);

এবং List.ofহিসাবে সংজ্ঞায়িত করা হয়।

static <E> List<E> of(E e1, E e2);

যা পরে ক্ষয় হয়ে যায়।

static List of(Object e1, Object e2);

সংকলকটির রানটাইমের সময় জেনেরিক কী কী তা কোন ধারণা নেই, তাই আপনি যদি এই জাতীয় কিছু লিখেন।

Object list = List.of("a", "b");
List<Integer> actualList = (List<Integer>) list;

কোনও প্রোগ্রাম চলাকালীন জাভা ভার্চুয়াল মেশিনের জেনেরিক প্রকারগুলি কী তা সম্পর্কে কোনও ধারণা নেই, সুতরাং এটি সংকলন করে চালিত হয়, জাভা ভার্চুয়াল মেশিনের ক্ষেত্রে এটি Listটাইপ করার জন্য একটি কাস্ট (এটি যা যা যাচাই করতে পারে এটি কেবল এটিই যাচাই করে)।

তবে এখন এই লাইনটি যুক্ত করুন।

Integer hello = actualList.get(0);

এবং জেভিএম অপ্রত্যাশিতভাবে ফেলে দেবে ClassCastException, কারণ জাভা সংকলক একটি অন্তর্নিহিত কাস্ট inুকিয়েছে।

java.lang.ClassCastException: java.base/java.lang.String cannot be cast to java.base/java.lang.Integer

একটি uncheckedসতর্কতা একজন প্রোগ্রামারকে বলে যে একটি কাস্ট একটি প্রোগ্রামকে অন্য কোনও জায়গায় ব্যতিক্রম ছড়িয়ে দিতে পারে। সতর্কতার সাথে দমন করা সংকলককে @SuppressWarnings("unchecked")বলে যে প্রোগ্রামার কোডটি নিরাপদ বলে বিশ্বাস করে এবং অপ্রত্যাশিত ব্যতিক্রম ঘটায় না।

আপনি এটি কেন করতে চান? সমস্ত সম্ভাব্য ধরণের ব্যবহারের ধরণগুলি উপস্থাপন করতে জাভা টাইপ সিস্টেমটি যথেষ্ট ভাল নয়। কখনও কখনও আপনি জানেন যে কোনও কাস্ট নিরাপদ, তবে জাভা এটি বলার কোনও উপায় সরবরাহ করে না - এই জাতীয় সতর্কতাগুলি গোপন @SupressWarnings("unchecked")করতে ব্যবহার করা যেতে পারে, যাতে কোনও প্রোগ্রামার প্রকৃত সতর্কবাণীগুলিতে ফোকাস করতে পারে। উদাহরণস্বরূপ, Optional.empty()কোনও মূল্য সঞ্চয় না করে খালি বিকল্পগুলির বরাদ্দ এড়াতে একটি সিঙ্গলটন ফেরত দেয়।

private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

এই কাস্টটি নিরাপদ, কারণ খালি alচ্ছিকভাবে সঞ্চিত মানটি পুনরুদ্ধার করা যায় না তাই অপ্রত্যাশিত শ্রেণির কাস্ট ব্যতিক্রম হওয়ার ঝুঁকি নেই।


5

আপনি সংকলক সতর্কবার্তাগুলি দমন করতে পারেন এবং জেনারিকদের বলতে পারেন যে আপনি যে কোডটি লিখেছিলেন তা সে অনুযায়ী আইনী।

উদাহরণ:

@SuppressWarnings("unchecked")
public List<ReservationMealPlan> retreiveMealPlan() {
     List<ReservationMealPlan> list=new ArrayList<ReservationMealPlan>();
    TestMenuService testMenuService=new TestMenuService(em, this.selectedInstance);
    list = testMenuService.getMeal(reservationMealPlan);
    return list;
 }

5

একটি কৌশলটি এমন একটি ইন্টারফেস তৈরি করা যা জেনেরিক বেস ইন্টারফেসকে প্রসারিত করে ...

public interface LoadFutures extends Map<UUID, Future<LoadResult>> {}

তারপরে আপনি কাস্টের আগে উদাহরণ সহ এটি পরীক্ষা করতে পারেন ...

Object obj = context.getAttribute(FUTURES);
if (!(obj instanceof LoadFutures)) {
    String format = "Servlet context attribute \"%s\" is not of type "
            + "LoadFutures. Its type is %s.";
    String msg = String.format(format, FUTURES, obj.getClass());
    throw new RuntimeException(msg);
}
return (LoadFutures) obj;

4

আমি যতদূর জানি, আপাতত জেনারিকদের সম্পর্কে সতর্কবার্তা দমন করার সাথে এটি করা দরকার; জেনারিকস একটি নতুন প্রোগ্রামিং কনস্ট্রাক্ট যা জেডিকে সংস্করণগুলিতে জেডিকে 5 এর আগে সমর্থিত নয়, সুতরাং নতুনগুলির সাথে পুরানো রচনাগুলির কোনও মিশ্রণ কিছু অপ্রত্যাশিত ফলাফলের কারণ হতে পারে।

সংকলক প্রোগ্রামারটিকে এটি সম্পর্কে সতর্ক করে, তবে প্রোগ্রামার যদি ইতিমধ্যে জেনে থাকে তবে তারা সেই ভয়ঙ্কর সতর্কতাগুলি সাপ্রেস ওয়ার্নিংস ব্যবহার করে বন্ধ করতে পারে।


1
জেডি কে 5 নতুন? এটি পরিষেবা জীবনের শেষ সময়ের বেশিরভাগটি শেষ করেছে।
টম হাটিন -

আমি জানি যে জেডিকে ৫ টি বরং পুরানো, আমার অর্থ এই ছিল যে এটি জাভাতে নতুন বৈশিষ্ট্য প্রবর্তন করেছে, এটি আগে জেডিকে দেওয়া হয়নি Also এছাড়াও আরও মনে রাখবেন যে সেখানে জেডিকে ৫ রেখে যাওয়ার আগে জেডিকে awa এর অপেক্ষায় এখনও রয়েছে জেডিকে 6 আলিঙ্গন করার জন্য, আমি কারণটি করতে পারি না!
বেকারহ্যাকার

2

একটি সতর্কতা যার দ্বারা সংকলকটি নির্দেশ করে যে এটি ধরণের সুরক্ষা নিশ্চিত করতে পারে না। "চেক না করা" সতর্কতা শব্দটি বিভ্রান্তিকর। এর অর্থ এই নয় যে সতর্কতাটি কোনওভাবেই চেক করা হয়নি। শব্দটি "চেক না করা" বলতে বোঝায় যে সংকলক এবং রানটাইম সিস্টেমে সমস্ত ধরণের চেক সঞ্চালনের জন্য পর্যাপ্ত ধরনের তথ্য নেই যা টাইপ সুরক্ষা নিশ্চিত করার জন্য প্রয়োজনীয়। এই অর্থে, নির্দিষ্ট অপারেশনগুলি "চেক করা হয়নি"।

"চেক না করা" সতর্কতার সর্বাধিক সাধারণ উত্স হ'ল কাঁচা ধরণের ব্যবহার। কাঁচা ধরণের ভেরিয়েবলের মাধ্যমে যখন কোনও বস্তু অ্যাক্সেস করা হয় তখন "চেক না করা" সতর্কতা জারি করা হয়, কারণ কাঁচা টাইপ সমস্ত প্রয়োজনীয় ধরণের চেক সঞ্চালনের জন্য পর্যাপ্ত ধরণের তথ্য সরবরাহ করে না।

উদাহরণ (কাঁচা ধরণের সাথে একযোগে সতর্কতা অবলম্বন):

TreeSet set = new TreeSet(); 
set.add("abc");        // unchecked warning 
set.remove("abc");
warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.TreeSet 
               set.add("abc");  
                      ^

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

"চেক না করা" সতর্কতাগুলিও রিপোর্ট করা হয় যখন সংকলক এমন কাস্ট খুঁজে পায় যার টার্গেট টাইপ হয় প্যারামিটারাইজড টাইপ বা টাইপ পরামিতি।

উদাহরণ (একটি প্যারামিটারাইজড টাইপ বা ভেরিয়েবল টাইপের সাথে কাস্টের সাথে এক চেক করা সতর্কতা):

  class Wrapper<T> { 
  private T wrapped ; 
  public Wrapper (T arg) {wrapped = arg;} 
  ... 
  public Wrapper <T> clone() { 
    Wrapper<T> clon = null; 
     try {  
       clon = (Wrapper<T>) super.clone(); // unchecked warning 
     } catch (CloneNotSupportedException e) {  
       throw new InternalError();  
     } 
     try {  
       Class<?> clzz = this.wrapped.getClass(); 
       Method   meth = clzz.getMethod("clone", new Class[0]); 
       Object   dupl = meth.invoke(this.wrapped, new Object[0]); 
       clon.wrapped = (T) dupl; // unchecked warning 
     } catch (Exception e) {} 
     return clon; 
  } 
} 
warning: [unchecked] unchecked cast 
found   : java.lang.Object 
required: Wrapper <T> 
                  clon = ( Wrapper <T>)super.clone();  
                                                ^ 
warning: [unchecked] unchecked cast 
found   : java.lang.Object 
required: T 
                  clon. wrapped = (T)dupl;

একটি কাস্ট যার টার্গেট টাইপ হয় (কংক্রিট বা বাউন্ডেড ওয়াইল্ডকার্ড) প্যারামিটারাইজড টাইপ বা টাইপ প্যারামিটার অনিরাপদ, যদি রানটাইমের সময় ডায়নামিক টাইপ চেক জড়িত থাকে। রানটাইমের সময়, কেবল ক্ষয় করার ধরণটি পাওয়া যায়, উত্স কোডে দৃশ্যমান সঠিক স্ট্যাটিক ধরণের নয় not ফলস্বরূপ, কাস্টের রানটাইম অংশটি ক্ষয়ের ধরণের উপর ভিত্তি করে সঞ্চালিত হয়, সঠিক স্ট্যাটিক টাইপের ভিত্তিতে নয়।

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

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

দয়া করে উল্লেখ করুন: "পরীক্ষা না করা" সতর্কতা কী?


2

@ সাপ্রেস ওয়ার্নিংস টীকাগুলি জেডিকে উপলভ্য তিনটি অন্তর্নির্মিত টিকাগুলির মধ্যে একটি এবং জাভা 1.5 তে @ ওভাররাইড এবং @ প্রসারিত দ্বারা যুক্ত করা হয়েছে।

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

আপনি @ সাপ্রেস ওয়ার্নিংস ("চেক না করা") এবং @ সাপ্রেস ওয়ার্নিংস ("সিরিয়াল"), @ সাপ্রেস ওয়ার্নিংস টীকাটির জনপ্রিয় দুটি উদাহরণ দেখে থাকতে পারেন। প্রাক্তনটি চেক না করা কাস্টিংয়ের কারণে উত্পন্ন সতর্কতা দমন করতে ব্যবহৃত হয় যখন পরবর্তী সতর্কতাটি সিরিয়ালাইজযোগ্য ক্লাসে সিরিয়াল ভার্সনউইডিএড যোগ করার বিষয়ে মনে করিয়ে দেওয়ার জন্য ব্যবহৃত হয়।

আরও পড়ুন: https://javarevisited.blogspot.com/2015/09/ কি-is-suppresswarnings-annotation-in-java-unchecked-raw-seial.html#ixzz5rqQaOLUa

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