java - আমি একাধিক শাখায় ওভাররাইট করা একটি পরিবর্তনশীল প্রাক-ইনিশিয়েল করা উচিত?




string (6)

স্ট্রিং আরম্ভ করা ভাল বা এটিকে শূন্য হিসাবে ছেড়ে দেওয়া কি ভাল?

আপনার ভিত্তি ত্রুটিযুক্ত: স্ট্রিংটি আরম্ভ করার অর্থ এই নয় যে এর মানটি নাল।

আপনার ইচ্ছা মতো কোনও মান ব্যবহার করে দুর্ঘটনাক্রমে এড়াতে আপনাকে স্থানীয় ভেরিয়েবলটি অর্পণ করার আগে ব্যবহার করার অনুমতি নেই। যেমন, মানটি "নাল" নয়, এটি অপরিবর্তিত (*)।

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

উদাহরণস্বরূপ, কোডটি যদি এর মতো দেখায়:

private String myMethod(String gender)
{
    String newString = "";
    if(gender.equals("a"))
        newString = internal.getValue();
    else if (gender.equals("b");
        newString = external.getValue();
    // Oops! meant to check if gender.equals("c")

    return newString;
}

আপনার একটি বাগ থাকতে পারে, কারণ এখানে একটি অনুপস্থিত কেস রয়েছে যা আপনি চেক করেননি।

আপনি যদি ভেরিয়েবলের কাছে স্পষ্টভাবে null বরাদ্দ করে থাকেন তবে আপনার অনেক একই সমস্যা হবে; তবে এখন আপনার পদ্ধতিটি বাতিল হয়ে যাবে, এবং সম্ভবত কলিং কোডে একটি এনপিইর কারণ ঘটবে।

যদি আপনি = "" বাদ দিয়ে থাকেন তবে সংকলক আপনাকে newString ব্যবহার বন্ধ করবে।

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

(*) এটি কেবল স্থানীয় ভেরিয়েবল এবং final সদস্য / স্থিতিশীল ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য। চূড়ান্ত না হলে ক্লাসের সদস্যদের অবশ্যই ব্যবহারের আগে নিযুক্ত করার দরকার নেই, এটি বাগের জন্য একটি সমৃদ্ধ সিম এবং ক্লাসের সদস্যদের যেখানেই সম্ভব চূড়ান্ত করার একটি ভাল কারণ। এবং, প্রযুক্তিগতভাবে, final সদস্যদের প্রথমে তাদের টাইপের ডিফল্ট মান থেকে আরম্ভ করা হয়, তাই আপনি প্রাথমিকভাবে তাদের আরম্ভ করার আগে null হিসাবে পড়তে পারেন।

একটি পদ্ধতি আছে:

private String myMethod(String gender)
{
    String newString = "";
    if(gender.equals("a"))
        newString = internal.getValue();
    else
        newString = external.getValue();

    return newString;
}

আমি সবকিছু রিফ্যাক্টর করেছিলাম, তবে একটি ছোট পরিবর্তন দিয়ে: String newString; পরিবর্তে: String newString = "";

এই রিফ্যাক্টর কোডটি উন্নত করে? আমি জানি যে String যখন আমরা এটি আরম্ভ করি না তখন নਾਲ হয়, তবে এই উদাহরণে সর্বদা যদি if else মান হয় a এই চুল্লী কিছু পরিবর্তন করে?


আপনার ক্ষেত্রে (অন্য শর্ত থাকলে) String আরম্ভ করার দরকার নেই, আপনি এটিকে String newString; হিসাবে সরল করে দিতে পারেন String newString; এবং এটি ঠিক হবে কারণ যে কোনও উপায়ে, শেষে এটির একটি পৃথক মান থাকবে।

private String myMethod(String gender)
{
    String newString;

    if(gender.equals("a"))
        newString = internal.getValue();
    else
        newString = external.getValue();

    // Missing return statement.
}

এছাড়াও, আমি দেখতে পাচ্ছি যে আপনার একটি ফাংশন রয়েছে যা একটি স্ট্রিং প্রদান করে। ধরে newString যে নতুন newString ভেরিয়েবলটি আপনি কী ফিরে আসবেন, একটি স্ট্রিং ভেরিয়েবল তৈরি করার পরিবর্তে আপনি newString স্ট্রিংটি সহজ করে দিতে পারবেন:

private String myMethod(String gender)
{
    if(gender.equals("a"))
        return internal.getValue();
    else
        return external.getValue();
}

আমার কলেজগুলি ঠিক আছে, টেনারি অপারেটরের সাথে এটি করা যেতে পারে। অতিরিক্ত হিসাবে আমি নুলপোয়েটার এক্সপেকশনগুলি যত তাড়াতাড়ি সম্ভব প্রতিরোধ করা এটির খুব গুরুত্বপূর্ণ মনে করি। লিঙ্গ নাল হবে কি? নালপয়েন্টার এক্সসেপশন আমি "এ" এবং লিঙ্গ এর মত স্যুইচ করব:

    private String myMethod(String gender) {
        return "a".equals(gender)
            ? internal.getValue()
            : external.getValue();
    }

ত্রিনিয়ারী অপারেটর ছাড়াই আমার সংক্ষিপ্ততম ফর্মটি গ্রহণ করুন (যা আমার মনে হয় পাঠ্যতা হ্রাস পায়):

private String myMethod(String gender)
{
    if(gender.equals("a"))
        return internal.getValue();
    return external.getValue();
}

আমার নিজের কোডে অন্য উত্তরগুলির মতো if {...} else {...} তৈরি করাতে আমার সম্ভবত একটি পূর্ণতা থাকবে।

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


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

একটি ভেরিয়েবল বরাদ্দ করার জন্য দুটি রিটার্ন বা একটি ব্রাঞ্চিং স্টেটমেন্টের পরিবর্তে, আমি কেবল একটি টের্নারি দিয়ে ফিরে আসব:

private String myMethod(String gender) {
    return gender.equals("a")
            ? internal.getValue()
            : external.getValue();
}

জাভা ডক অনুসারে:

ডিফল্ট মান

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

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





string