চূড়ান্ত হিসাবে জাভা পদ্ধতির যুক্তি তৈরি করা


92

finalনীচের কোডের মধ্যে কী পার্থক্য রয়েছে। হিসাবে যুক্তি ঘোষণার কোন সুবিধা আছে কি final?

public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){  
    return ....
}

public String changeTimezone(final Timestamp stamp, final Timezone fTz, 
        final Timezone toTz){
    return ....
}

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


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

উত্তর:


131

একটি আনুষ্ঠানিক পদ্ধতির প্যারামিটারটি স্থানীয় পরিবর্তনশীল হিসাবে, চূড়ান্ত হিসাবে ঘোষিত হলেই আপনি তাদের অভ্যন্তরীণ বেনাম শ্রেণি থেকে অ্যাক্সেস করতে পারবেন।

এটি আপনাকে মেথড বডিটিতে আরেকটি স্থানীয় চূড়ান্ত পরিবর্তনশীল ঘোষণা থেকে বাঁচায়:

 void m(final int param) {
        new Thread(new Runnable() {
            public void run() {
                System.err.println(param);
            }
        }).start();
    }

27
+1: এটি একটি গুরুত্বপূর্ণ ব্যবহারের কেস, এবং যখন আপনার প্রয়োজন হয়। (বাকি সময়টি প্রোগ্রামারকে সাহায্য করার জন্য কী সুবিধাজনক তা কেবলমাত্র ব্যাপার।)
ডোনাল ফেলো

4
আমি কি এর পিছনে যুক্তি জিজ্ঞাসা করতে পারি?
কোডে ওয়ারিয়র

21
জাভা 8 এর সাথে আর দরকার নেই
অমিত পারাশর

4
: @simgineer এখানে পড়তে stackoverflow.com/questions/28408109/...
PeterMmm

4
@ অমিতপরাশর সত্য, তবে জাভা 8 আপনাকে "চূড়ান্ত" কীওয়ার্ডটি প্রতিবার অভ্যন্তরীণ শ্রেণিতে ভেরিয়েবলটি ব্যবহার করতে হবে তা থেকে বাঁচিয়েছে ... বাস্তবতাটি হ'ল সংকলকটি কেবল চূড়ান্ততার অন্তর্নিহিত করছে, আপনি এখনও কার্যকরভাবে চূড়ান্ত হওয়ার জন্য ভেরিয়েবলের প্রয়োজন ... সুতরাং, পরে যদি আপনি এটি নির্ধারণ করার চেষ্টা করেন তবে আপনি একটি সংকলন সময়ের ত্রুটি পাবেন! জাভা 8 : ছিঁচকে 100 :)
বরুণ

38

চূড়ান্ত কীওয়ার্ডের চূড়ান্ত শব্দ থেকে এক্সট্রাক্ট

চূড়ান্ত পরামিতি

নিম্নলিখিত নমুনা চূড়ান্ত পরামিতি ঘোষণা করে:

public void doSomething(final int i, final int j)
{
  // cannot change the value of i or j here...
  // any change would be visible only inside the method...
}

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

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


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

27

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

অবশ্যই মানতে হবে আমি পরামিতিগুলির জন্য চূড়ান্ত ব্যবহারের কথা খুব কমই মনে করি, আমারও উচিত।

public int example(final int basicRate){
    int discountRate;

    discountRate = basicRate - 10;
    // ... lots of code here 
    if ( isGoldCustomer ) {
        basicRate--;  // typo, we intended to say discountRate--, final catches this
    }
    // ... more code here

    return discountRate;
}

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

14

এটি খুব একটা পার্থক্য করে না। এর কেবল অর্থ হ'ল আপনি লিখতে পারবেন না:

stamp = null;
fTz = new ...;

তবে আপনি এখনও লিখতে পারেন:

stamp.setXXX(...);
fTz.setXXX(...);

এটি মূলত রক্ষণাবেক্ষণ প্রোগ্রামারের জন্য একটি ইঙ্গিত যা আপনাকে অনুসরণ করে যে আপনি নিজের পদ্ধতির মাঝখানে এমন কোনও পরামিতি যেখানে কোনও স্পষ্ট নয় এবং তাই বিভ্রান্তির কারণ হয়ে উঠতে যাচ্ছেন না a


3

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


4
আমাকে কিছু যুক্ত করতে হবে: পরামিতিগুলি যদি প্রাথমিক হয় তবে আমি কোনও পার্থক্য দেখি না। এছাড়াও, পরামিতিগুলি যদি সংগ্রহগুলি হয় (অবজেক্টগুলির একটি তালিকা ...), চূড়ান্ত যোগ করা তাদের পরিবর্তন করা রোধ করতে পারে না।
Sam003

4
অপরিচ্ছন্নতা সর্বদা একটি পছন্দসই বৈশিষ্ট্য। জাভা এটি বাক্সের বাইরে নেই। ভেরিয়েবলগুলি চূড়ান্ত করা কমপক্ষে রেফারেন্সের সততা নিশ্চিত করে।
সিড

4
আমি রাজী. তবে আমরা যদি সত্যই বস্তুর জন্য অপরিবর্তনীয়তা অর্জন করতে চাই তবে আমরা একটি গভীর ক্লোন তৈরি করার চেষ্টা করতে পারি।
Sam003

2

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


2

আমি যে দুটি সুবিধা দেখছি তা তালিকাভুক্ত:

1 পদ্ধতির যুক্তিটিকে চূড়ান্ত হিসাবে চিহ্নিত করা পদ্ধতির অভ্যন্তরে যুক্তির পুনরায় নিয়োগকে বাধা দেয়

আপনার উদাহরণ থেকে

    public String changeTimezone(final Timestamp stamp, final Timezone fTz, 
            final Timezone toTz){
    
    // THIS WILL CAUSE COMPILATION ERROR as fTz is marked as final argument

      fTz = Calendar.getInstance().getTimeZone();     
      return ..
    
    }

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

2 একটি বেনামি অভ্যন্তরীণ শ্রেণিতে যুক্তি পাস করা

একটি আনুষ্ঠানিক পদ্ধতির প্যারামিটারটি স্থানীয় পরিবর্তনশীল হিসাবে, চূড়ান্ত হিসাবে ঘোষিত হলেই আপনি তাদের অভ্যন্তরীণ বেনাম শ্রেণি থেকে অ্যাক্সেস করতে পারবেন।


1

- অতীতে (জাভা 8 :-) এর আগে)

"চূড়ান্ত" কীওয়ার্ডের অভ্যন্তরীণ বেনাম শ্রেণীর জন্য মেথড ভেরিয়েবলের অ্যাক্সেসিবিলিটির প্রভাবিত করুন।

- আধুনিক (জাভা 8+) ম্যাগাজিনে এ জাতীয় ব্যবহারের প্রয়োজন নেই:

জাভা "কার্যকরভাবে চূড়ান্ত" ভেরিয়েবল প্রবর্তন করে। স্থানীয় ভেরিয়েবল এবং পদ্ধতি পরামিতিগুলি চূড়ান্ত হিসাবে ধরে নেওয়া হয় যদি কোডটি ভেরিয়েবলের মান পরিবর্তন করতে বোঝায় না। সুতরাং আপনি যদি জাভা 8 + তে এই জাতীয় কীওয়ার্ডটি দেখেন তবে আপনি এটি অনিবার্য বলে ধরে নিতে পারেন। "কার্যকরভাবে চূড়ান্ত" পরিচিতি ল্যাম্বডাস ব্যবহার করার সময় আমাদের কম কোড টাইপ করে।


0

জাভাতে এটি কেবল একটি চুক্তি আপনাকে একটি চুক্তি সংজ্ঞায়িত করতে এবং এটিতে আটকে থাকতে সহায়তা করে। এখানে অনুরূপ আলোচনা: http://c2.com/cgi/wiki?JavaFinalConsideredEvil

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

সবচেয়ে খারাপ ক্ষেত্রে, আপনি যদি আরগস রেফারেন্সটিকে নতুন করে সংজ্ঞায়িত করেন তবে এটি কার্যক্রমে কার্যকর প্রকৃত মানকে প্রভাবিত করবে না - যেহেতু কেবলমাত্র একটি রেফারেন্স পাস হয়েছিল।


0

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

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


-3

চূড়ান্ত কীওয়ার্ড আপনাকে প্যারামিটারে নতুন মান নির্ধারণ থেকে বিরত রাখে। আমি এটি একটি সাধারণ উদাহরণ দিয়ে ব্যাখ্যা করতে চাই

ধরুন আমাদের একটা পদ্ধতি আছে

পদ্ধতি 1 () {

তারিখ তারিখ তারিখ = নতুন তারিখ ("1/1/2009");

মেথড 2 (তারিখপূর্ব জন্ম);

পদ্ধতি 3 (তারিখপূর্ব); }

সর্বজনীন মেহোদ 2 (তারিখ তারিখের জন্ম তারিখ) {
....
....
....
}

সর্বজনীন মেহোদ 2 (তারিখ তারিখের জন্ম তারিখ) {
....
....
....
}

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

এবং এটি জাভা কোডিং সেরা অভ্যাসগুলির মধ্যে একটি।


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