অবজেক্ট == নাল বা নাল == অবজেক্ট?


97

আমি কারও কাছ থেকে শুনেছি null == objectযা object == null চেক করার চেয়ে ভাল

যেমন:

void m1(Object obj ) {
   if(null == obj)  // Is this better than object == null ? Why ?
       return ;
   // Else blah blah
}

এর কোনও কারণ আছে বা এটি অন্য কল্পকাহিনী? সাহায্যের জন্য ধন্যবাদ.


271561 এবং 1957836 এর ডুপ (এটি বাদে 'জাভাতে বলে')
গিশু

20
জাভা সি #
জিওজয়

5
যদি ছিল একটি উল্লেখযোগ্য কর্মক্ষমতা সুবিধা, তারপর নিশ্চিত কম্পাইলার এটা নিখুত হবে ...
আন্দ্রিয়াস Dolk

জন্য nullউল্লেখ কর্ম ডিফল্ট অবশ্যই একটি NPE নিক্ষেপ করা হবে। কিছু দুর্দান্ত লাইব্রেরি (যেমন জেডিকে 7 জাভা গ্রন্থাগার) এর মতো পদ্ধতি রয়েছে public static <T> T notNull(T obj) { if (obj == null) { throw new NullPointerException(); } else { return obj; } }। এছাড়াও আছে @NonNull(বা @Nonnull?), কিন্তু এটি "মুছে ফেলা" হয়ে যায়।
টম হাটিন -

উত্তর:


140

এই ধরণের টাইপগুলি এড়াতে সম্ভবত সি এর কাছ থেকে জানা একটি অভ্যাস (ডাবলের =পরিবর্তে একক ==):

if (object = null) {

==জাভাতে ধ্রুবকটি বাম দিকে স্থাপনের সম্মেলনটি জাভাতে সত্যই কার্যকর নয় যেহেতু জাভাটির ifমূল্যায়নের জন্য কোনও booleanমূল্যকে মূল্যায়নের প্রয়োজন হয়, সুতরাং ধ্রুবকটি যদি না হয় তবে booleanআপনি যেভাবেই রাখবেন তেমন একটি সংকলন ত্রুটি পাবেন যুক্তি. (এবং এটি যদি বুলিয়ান হয় তবে আপনার ==কোনওভাবেই ব্যবহার করা উচিত নয় ...)


4
যা জাভা জন্য খুব দরকারী অভ্যাস নয়, যেহেতু
টাইপোর

11
নির্দিষ্ট কোণার ক্ষেত্রে বাদে। stackoverflow.com/questions/2369226/null-check-in-java/…
চন্দ্র সেকার

4
@ বুদ্বীপের জন্য চন্দ্রু, আপনি ব্যবহার করতে পারেন x.booleanValue()বা !x.booleanValue()x == trueবা x == falseশর্তে প্রকাশের দুর্গন্ধ, আইএমএইচও।
লরেন্স গনসালভেস

4
তিনি এখানে শূন্য জন্য পরীক্ষা করা হয়। এবং এমন কেস রয়েছে যেখানে তাকে সত্যই নুলের জন্য একটি বুলিয়ান পরীক্ষা করতে হবে কারণ নাল সত্য বা মিথ্যাও নয়।
চন্দ্র সেকার

4
null == objectটাইপ দিয়ে আমরা দুর্ঘটনাক্রমে বস্তুটি ওভাররাইট না করি তা নিশ্চিত করার জন্য ব্যবহার করতে অভ্যস্ত হওয়া কোনওভাবেই ইউজকেস না হওয়া উচিত। যার অর্থ হ'ল আমরা নিজেরাই প্রশিক্ষণ দিচ্ছি যে এখন আমি প্রথমে "নাল" ব্যবহার করি, ঠিক আছে, এমনকি আমি ভুল করলেও। এর অর্থ এই নয় যে কোডটি প্রত্যাশার মতো কাজ করে। এমনকি যদি null = objectজায়গায় দেওয়া হয় null == object, তবে প্রোগ্রামটি প্রত্যাশার মতো কাজ করছে না! তাহলে এই সম্মেলনটি অনুসরণ করার কোনও মানে নেই!
ভানাগস 6:59

33

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

কি করেননি উল্লিখিত হয়েছে যে অনেক মানুষ (নিজেকে অবশ্যই অন্তর্ভুক্ত) খুঁজতে if (variable == constant)এটা নিজেকে প্রকাশ করতে আরও বেশি উপায় - ফর্ম আরো ভালো পঠনযোগ্য যাবে। এটি সি এর কাছ থেকে কোনও কনভেনশন অন্ধভাবে অনুলিপি না করার কারণ in একটি পরিবেশে দরকারী যেটি অন্য পরিবেশে কার্যকর হতে পারে তা ধরে নেওয়ার আগে আপনার সর্বদা অনুশীলনগুলি প্রশ্ন করা উচিত (যেমন আপনি এখানে করছেন)।


4
আপনি বলেছেন প্রতিটি কথার সাথে আমি একমত, বিশেষত "অন্ধভাবে একটি সম্মেলন অনুলিপি" অংশ। আমি এখনই একটি কোড পড়ছি এবং নাল = অবজেক্ট স্টাইলটি আমাকে এতটা বিরক্ত করে যে আমি এটি সন্ধান করছি এবং এখানে এসেছি। কোডার কী ভাবছিল?
অ্যাড্রিয়ান এম

28

জাভাতে (1.5++) এর খুব বেশি মূল্য নেই যখন বস্তুর প্রকারটি বাদে Boolean। কোন ক্ষেত্রে এটি এখনও কার্যকর হতে পারে।

if (object = null)যদি জাভা 1.5++ তে সংকলন ব্যর্থতা সৃষ্টি করে না তবে এটি যদি রানটাইমটিতে Booleanএকটি নিক্ষেপ করে NullPointerException


আপনি সম্ভবত বোঝানো এটা সংকলন ব্যর্থতা কারণ হবে :)
vava

7
না এটি কোনও সংকলনের ত্রুটি সৃষ্টি করবে না যখন বস্তুটি বুলিয়ান।
চন্দ্র সেকার

বুলিয়ান ছাড়াও প্রতিটি বস্তুর ধরণের ক্ষেত্রে কি একইরকম নয়?
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

4
নন-বুলিয়ান প্রকারের জন্য, কোডটি সংকলন করবে না কারণ "অবজেক্ট = নাল" এক্সপ্রেশনটির ধরণটি বুলিয়ান নয়। অটো-বক্সিংয়ের কারণে এটি বুলিয়ান সংগ্রহ করবে।
চন্দ্র সেকার

তবে কেন বুলিয়ানদের জন্য এই আচরণ? কোন যুক্তি?
রোহিত বঙ্গ

9

জাভাতে কোনও ভাল কারণ নেই।

অন্যান্য বেশ কয়েকটি উত্তর দাবি করেছে যে এটি কারণ আপনি ঘটনাক্রমে সমতার পরিবর্তে এটিকে দায়িত্ব অর্পণ করতে পারেন। তবে জাভাতে আপনার যদি একটি বুলিয়ান থাকতে হয় তবে এটি:

if (o = null)

সংকলন করবে না।

ভেরিয়েবলটি বুলিয়ান হলে জাভাতে কেবলমাত্র এটিই কার্যকর হতে পারে:

int m1(boolean x)
{
    if (x = true)  // oops, assignment instead of equality

4
তবে কেন আপনি কখনও == trueবা সমানভাবে লিখবেন == true == true
টম হাটিন -

7
লেখার উপযুক্ত কারণ নেই == true। তবে আমি আমার কেরিয়ারে এতটা খারাপ কোড দেখেছি যে আমি কেউ জিজ্ঞাসা করি না কেন কেউ কিছু লিখবে এবং কেবল গ্রহণ করবে যে কিছু লোক অপ্রয়োজনীয় / প্রশ্নযুক্ত কোড লিখেছিল wrote
আর স্যামুয়েল ক্লাটচো

4
প্রকৃতপক্ষে, চারপাশে প্রচুর দুর্বল কোড রয়েছে, এখনও, যখন x == trueএটি খারাপ বিবেচনা করা হচ্ছে কারণ এটি ভুলভাবে লিখে দেওয়া যেতে পারে , কেবলমাত্র পরিবর্তে x = trueএটির পরিবর্তনে তেমন বুদ্ধি নেই । true == xx
হলগার

9

এটিও নিবিড়ভাবে সম্পর্কিত:

if ("foo".equals(bar)) {

আপনি এনপিইগুলি সাথে ডিল করতে না চাইলে এটি সুবিধাজনক:

if (bar!=null && bar.equals("foo")) {

সুবিধাজনক হতে পারে তবে বিপদজনক হতে পারে ব্লু
অলিভার ওয়াটকিন্স

@ অলিভার ওয়াটকিন্স: আমি এই নিবন্ধটি দুর্বল বলে মনে করি। ধরুন ভেরিয়েবলটি টাইপ ইন্টের ছিল। যদি অবিশ্রান্ত অবস্থায় ছেড়ে দেওয়া হয় তবে মানটি 0 হবে এবং নিবন্ধটির প্রতিশ্রুতি থাকবে না। স্ট্রিংস বস্তু এবং অন্তর্নিহিতগুলি আদিম প্রকৃত সত্য যে কোনও প্রোগ্রামার একটি পরিবর্তনশীল সূচনা করতে ভুলে যেতে পারে তা অপ্রাসঙ্গিক। এই প্রশ্নে আমরা কেবল নাল স্ট্রিং তুলনা জিনিসটি সমাধান করি।
চেরোভিম

সত্য যে @cherouvim intএকটি আদিম টাইপ হয় প্রাসঙ্গিক, যেমন ডাকা অসম্ভব equalsএকটি অন intব্যবহারের খাসি নিয়ে আলোচনা করে কোনো লাভ নেই, তাই x.equals(constant)বা constant.equals(x)জন্য intমান। এবং Integerমানের জন্য , ডিফল্ট মান nullপরিবর্তে হয় 0
হলগার

5

এই কৌশলটি v = nullটাইপগুলি ধরণের রোধ করতে পারে ।

তবে জাভা কেবল বুলিয়ান এক্সপ্রেশনকে if()শর্ত হিসাবে মঞ্জুরি দেয় যাতে কৌতুকটি বেশি অর্থবোধ করে না, সংকলক যেকোনভাবে সেই টাইপগুলি খুঁজে পেতে পারে।

যদিও এটি সি / সি ++ কোডের জন্য এখনও মূল্যবান কৌশল।


3

একই কারণে আপনি এটি সি তে করেন; অ্যাসাইনমেন্টটি একটি অভিব্যক্তি, সুতরাং আপনি আক্ষরিক বাম দিকে রেখেছেন যাতে আপনি যদি এটির =পরিবর্তে দুর্ঘটনাক্রমে ব্যবহার করেন তবে এটি ওভাররাইট করতে পারবেন না ==


এটি বুলিয়ান ধরণের জন্য জাভাতে কেবল একটি সমস্যা, যদিও তাই না? অন্য কোনও ধরণের অ্যাসাইনমেন্টের বুলেট জাতীয় ধরণ থাকবে না এবং এটি একটি সংকলক ত্রুটি ঘটায়।
স্কট স্মিথ

4
নাঃ, জাভা কম্পাইলার টাইপো যে ধরনের হোক না কেন আপনাকে পছন্দ ফেলবো
vava

@ জিজয় - আমি মনে করি না এর সাথে পারফরম্যান্সের কোনও যোগ আছে। এই ভয়ঙ্কর অ্যাসাইনমেন্ট-এর মধ্যে-শর্তসাপেক্ষ-এক্সপ্রেশন ভুল এড়াতে সি-তে একটি পুরানো কৌশল বলে মনে হচ্ছে। ধারণাটি ছিল যে আপনি যদি xসমান কিনা তা পরীক্ষা করে দেখার চেষ্টা করছেন 5, যখন আপনি ভুল করে টাইপ করেন if (x = 5), এটি নিঃশব্দে সংকলন করবে (এবং সর্বদা trueমূল্য নির্ধারণ করা হোক না কেন, এর মান নির্বিশেষে x)। তবে, আপনি যদি সর্বদা আক্ষরিক প্রথমে নির্দিষ্ট করার অভ্যাসে চলে যান: 'যদি (5 = x)', সংকলকটি আপনার কাজটি ডাবল-চেক করতে পারে এবং ডিবাগারে মাথা ঠেকানোর সময়কে বাঁচাতে পারে। আধুনিক সংকলকরা এই অভ্যাসটিকে অপ্রয়োজনীয় করে তোলে।
স্কট স্মিথ

6
-1: আপনি যদি দুর্ঘটনাক্রমে ব্যবহার করেন = এটি জাভাতে সংকলন করবে না; সুতরাং সি থেকে কারণ প্রযোজ্য নয়।
জন স্কিটি

প্রযুক্তিগতভাবে যদি objটাইপ হয় java.lang.Boolean(বিগ বি), তবে এটি একটি পার্থক্য করতে পারে (আমার মনে হয়, আসলে চেষ্টা করা হয়নি বা কিছুই নয়)।
টম হাটিন -

3

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

পছন্দ:

 String b = null;
 "constant".equals(b);  // result to false
 b.equals("constant");  // NullPointerException
 b != null && b.equals("constant");  // result to false

এনপিইর এই গোপনীয়তাটি আরও প্রবাহিত বাগগুলি খুঁজে পাওয়া আরও শক্ত করে তোলে
অলিভার ওয়াটকিন্স

2

এটি ইয়োদা শর্তটি বিভিন্ন উপায়ে লেখা

জাবাতে

String myString = null;
if (myString.equals("foobar")) { /* ... */ } //Will give u null pointer

yoda অবস্থা

String myString = null;
if ("foobar".equals(myString)) { /* ... */ } // will be false 

1

নিম্নলিখিত কোডের সাথে তুলনা করুন:

    String pingResult = "asd";
    long s = System.nanoTime ( );
    if ( null != pingResult )
    {
        System.out.println ( "null != pingResult" );
    }
    long e = System.nanoTime ( );
    System.out.println ( e - s );

    long s1 = System.nanoTime ( );
    if ( pingResult != null )
    {
        System.out.println ( "pingResult != null" );
    }
    long e1 = System.nanoTime ( );
    System.out.println ( e1 - s1 );

আউটপুট (একাধিক মৃত্যুদণ্ড কার্যকর হওয়ার পরে):

null != pingResult
325737
pingResult != null
47027

সুতরাং, pingResult != nullবিজয়ী হয়।


7
একটি অতিরিক্ত লুপে আপনার পরীক্ষা চালান! অথবা কেবল আইএফ স্টেটমেন্টগুলি স্যুইচ করুন। দীর্ঘ গল্প সংক্ষিপ্ত: কোন পার্থক্য নেই! প্রথম লুপটি সর্বদা ধীর হয়।
মার্সেল জেস্কে

এই পরীক্ষায়, পিংরসাল্ট সর্বদা শূন্য থাকে। পিং রেজাল্টের সময়টি কী হবে শূন্য? আমি এই প্ল্যাটফর্মটি স্বাধীন হিসাবে বাজি ধরছি, তবে আমার ওরাকল জাভা ১.6 / লিনাক্স স্ট্যাকের উপর, ফলাফলগুলি বেশ কিছুটা এমনকি (লুপে), পিংরসাল্ট নাল বাদে উভয় চেক কয়েক শতাংশ দ্রুত গতিতে রয়েছে।
ওগ্রে গীতসংহিতা 33

4
যদি আপনি "পিংরসাল্ট! = নাল ব্লকটি নালার আগে রাখেন! = পিংরসাল্ট ব্লক, এটির ফলাফল" পিংরসাল্ট! = নাল 325737 "এর মতো হবে
সোলা ইয়াং

@ সোলা ইয়াং যেমন বলেছেন, আপনি যদি পিংরসাল্ট! = আগে নালায় রাখেন, আপনি দেখতে পাবেন যে এটি নাল! = পিংরসাল্টের চেয়ে বেশি সময় নেয়। যদি পিংরসাল্ট! = নাল নূন্যের চেয়ে দ্রুত ছিল! = পিংআরএসল্ট আইডিই (যেমন ইন্টেলিজি, এক্লিপস, ...) বিকাশকারীদের এই ভূমিকাটি ব্যবহার করতে বাধ্য করার জন্য একটি সতর্কতা দেবে;)
অ্যাডিলহিল্মি

1

তার কারণ বিনিময় সম্পত্তি , শুধুমাত্র মধ্যে পার্থক্য object == nullএবং null == object( Yoda সংস্করণ ) হল জ্ঞানীয় প্রকৃতি কিভাবে কোড পড়া এবং পাঠক দ্বারা জারিত হয়। যদিও আমি এর চূড়ান্ত উত্তর জানি না, তবে আমি জানি যে আমি ব্যক্তিগতভাবে যে বিষয়টিকে পরিদর্শন করছি তার সাথে অন্য কোনও কিছুর সাথে তুলনা করার চেয়ে আমি অন্য কিছুকে তুলনা করা পছন্দ করি , যদি এটি কোনও ধারণা দেয় তবে। বিষয়টি দিয়ে শুরু করুন, তারপরে এর সাথে তুলনা করার মানটি।

অন্য কয়েকটি ভাষায় এই তুলনা শৈলী আরও কার্যকর।

নিখোঁজ "=" সাইন ইন থেকে সাধারণভাবে সুরক্ষিত রাখার জন্য, যদিও আমি মনে করি যে রচনা প্রতিরক্ষা প্রোগ্রামিংয়েরnull == object একটি বিভ্রান্তিমূলক কাজ । এই নির্দিষ্ট কোডটির আরও ভাল উপায় হ'ল জুনিট পরীক্ষার সাথে আচরণের গ্যারান্টি দেওয়া। মনে রাখবেন, একটি "=" হারিয়ে যাওয়ার সম্ভাব্য ভুল পদ্ধতিটির ইনপুট আর্গুমেন্টের উপর নির্ভর করে না - আপনি অন্যান্য লোকেরা এই এপিআইয়ের সঠিক ব্যবহারের উপর নির্ভর করেন না - সুতরাং পরিবর্তে একটি জুনিট পরীক্ষা তার বিরুদ্ধে সুরক্ষার পক্ষে উপযুক্ত। যাইহোক আপনি আচরণটি যাচাই করতে জুনিট টেস্টগুলি লিখতে চান; একটি অনুপস্থিত "=" স্বাভাবিকভাবেই সুযোগের মধ্যে পড়ে।

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