কেন কেবল চূড়ান্ত পরিবর্তনশীল বেনামে শ্রেণিতে প্রবেশযোগ্য?


354
  1. aএখানে শুধুমাত্র চূড়ান্ত হতে পারে। কেন? কীভাবে আমি ব্যক্তিগত সদস্য হিসাবে না রেখে পদ্ধতিতে পুনরায় সাইন aইন করতে পারি onClick()?

    private void f(Button b, final int a){
        b.addClickHandler(new ClickHandler() {
    
            @Override
            public void onClick(ClickEvent event) {
                int b = a*5;
    
            }
        });
    }
  2. 5 * aএটি ক্লিক করা হলে আমি কীভাবে ফিরে আসতে পারি ? আমি বলতে চাচ্ছি,

    private void f(Button b, final int a){
        b.addClickHandler(new ClickHandler() {
    
            @Override
            public void onClick(ClickEvent event) {
                 int b = a*5;
                 return b; // but return type is void 
            }
        });
    }

1
আমি মনে করি না যে জাভা
বেনাম শ্রেণীরা যে ধরণের ল্যাম্বদা

4
আপনি কি অর্জন করার চেষ্টা করছেন? "এফ" শেষ হলে ক্লিক হ্যান্ডলার কার্যকর করা যেতে পারে।
ইভান ডাবরভ

@ ল্যামবার্ট যদি আপনি অনক্লিক পদ্ধতিতে একটি ব্যবহার করতে চান তবে এটি চূড়ান্ত হতে হবে @ চ কীভাবে ক্লিক করা যেতে পারে () পদ্ধতি কীভাবে অন ক্লিক () পদ্ধতিতে ফিরে আসার মতো আচরণ করতে পারে

2
এটাই আমার অর্থ - এটি সম্পূর্ণ বন্ধকে সমর্থন করে না কারণ এটি চূড়ান্তভাবে চূড়ান্ত অ্যাক্সেসের অনুমতি দেয় না।
user541686

4
দ্রষ্টব্য: জাভা 8 হিসাবে আপনার পরিবর্তনশীলটি কেবল কার্যকরভাবে চূড়ান্ত হওয়া দরকার
পিটার ল্যারি

উত্তর:


489

মন্তব্যে উল্লিখিত হিসাবে, এর কিছু জাভা 8-তে অপ্রাসঙ্গিক হয়ে যায়, যেখানে অন্তর্ভুক্ত finalথাকতে পারে। যদিও শুধুমাত্র একটি কার্যকর চূড়ান্ত পরিবর্তনশীল বেনামি অভ্যন্তর শ্রেণি বা ল্যাম্বডা এক্সপ্রেশনটিতে ব্যবহার করা যেতে পারে।


এটা তোলে কারণে পথ জাভা পরিচালনা করতে মূলত এর বন্ধ

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

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

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

আপনি যদি জাভা এবং সি # বন্ধের মধ্যে আরও বিস্তারিত তুলনা করতে আগ্রহী হন, আমার কাছে একটি নিবন্ধ রয়েছে যা এটি আরও পরে যায়। আমি এই উত্তরে জাভা দিকে ফোকাস করতে চেয়েছিলাম :)


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


11
এটি জাভা for-এর ক্ষেত্রে সত্য ছিল, মনে রাখবেন যে জাভা 8 এর সাথে ক্লোজারগুলি চালু করা হয়েছে এবং এখন তার অভ্যন্তরীণ শ্রেণি থেকে কোনও শ্রেণির একটি চূড়ান্ত চূড়ান্ত ক্ষেত্রটি অ্যাক্সেস করা সম্ভব।
ম্যাথিয়াস Bader

22
@ ম্যাথিয়াসবাডার: সত্যি? আমি ভেবেছিলাম এটি এখনও মূলত একই প্রক্রিয়া, সংকলক এখন নির্ণয়ের জন্য যথেষ্ট চালাক final(তবে এটি এখনও কার্যকরভাবে চূড়ান্ত হওয়া দরকার)।
থিলো

3
@ ম্যাথিয়াস বদর: আপনি সর্বদা অ চূড়ান্ত ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারতেন , যেগুলি স্থানীয় ভেরিয়েবলগুলির সাথে বিভ্রান্ত হবে না , যা চূড়ান্ত হতে হবে এবং এখনও কার্যকরভাবে চূড়ান্ত হতে হবে, তাই জাভা 8 শব্দার্থবিজ্ঞানের পরিবর্তন করে না।
হোলার

41

একটি কৌশল আছে যা বেনাম শ্রেণিকে বাইরের স্কোপে ডেটা আপডেট করার অনুমতি দেয়।

private void f(Button b, final int a) {
    final int[] res = new int[1];
    b.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            res[0] = a * 5;
        }
    });

    // But at this point handler is most likely not executed yet!
    // How should we now res[0] is ready?
}

তবে সিঙ্ক্রোনাইজেশন সংক্রান্ত সমস্যার কারণে এই কৌশলটি খুব ভাল নয়। যদি হ্যান্ডলারটি পরে অনুরোধ করা হয় তবে আপনার 1) হ্যান্ডলারের বিভিন্ন থ্রেড থেকে আহ্বান করা হলে পুনরায় পুনরায় সংকেত সংযোজন করতে হবে 2) এমন কিছু ধরণের পতাকা বা ইঙ্গিত থাকতে হবে যা পুনরায় আপডেট হয়েছে was

এই কৌশলটি ঠিক আছে, যদিও বেনাম শ্রেণীর সাথে সাথে একই থ্রেডে ডাকা হয়। ভালো লেগেছে:

// ...

final int[] res = new int[1];
Runnable r = new Runnable() { public void run() { res[0] = 123; } };
r.run();
System.out.println(res[0]);

// ...

2
আপনার উত্তরের জন্য ধন্যবাদ. আমি এই সব জানি এবং আমার সমাধান এর চেয়ে ভাল। আমার প্রশ্ন "চূড়ান্ত কেন"?

6
এর পরে উত্তরটি হ'ল এগুলি কীভাবে কার্যকর করা হয় :)
ইভান ডুব্রভ

1
ধন্যবাদ। আমি নিজের উপরের কৌশলটি ব্যবহার করেছি। আমি এটি নিশ্চিত ছিল না এটি একটি ভাল ধারণা কিনা। জাভা যদি এটির অনুমতি না দেয় তবে একটি ভাল কারণ থাকতে পারে। আপনার উত্তরটি স্পষ্ট করে যে আমার List.forEachকোডটি নিরাপদ।
রানটাইম এক্সসেপশন

"কেন কেবলমাত্র চূড়ান্ত" এর পিছনে যুক্তি নিয়ে ভাল আলোচনার জন্য স্ট্যাকওভারফ্লো.com/q/12830611/2073130 পড়ুন ।
lcn

বেশ কয়েকটি কর্মক্ষেত্র রয়েছে। খনিটি হ'ল: ফাইনাল ইন রেজফ = রেজ; প্রথমদিকে আমি অ্যারে পদ্ধতির ব্যবহার করেছি তবে এটি আমার কাছে খুব জটিল একটি বাক্য গঠন রয়েছে বলে মনে হয়েছে। অ্যাটমিক রেফারেন্স সম্ভবত কিছুটা ধীর (কোনও বস্তুকে বরাদ্দ দেয়)।
জাকম্যাক

17

একটি বেনাম শ্রেণি একটি অভ্যন্তর শ্রেণি এবং কঠোর নিয়ম অভ্যন্তরীণ ক্লাসগুলিতে প্রযোজ্য (জেএলএস 8.1.3) :

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

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

( জনের পুরো উত্তর আছে - আমি এটিকে অপসৃত রেখেছি কারণ কেউ জেএলএস নিয়মে আগ্রহী হতে পারে)


11

প্রত্যাশিত মান পেতে আপনি একটি শ্রেণির স্তরের ভেরিয়েবল তৈরি করতে পারেন। আমি বলতে চাচ্ছি

class A {
    int k = 0;
    private void f(Button b, int a){
        b.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            k = a * 5;
        }
    });
}

এখন আপনি কে এর মান পেতে পারেন এবং আপনি যেখানে চান সেখানে এটি ব্যবহার করতে পারেন।

আপনার উত্তরটি হ'ল:

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

একটি স্থানীয় অভ্যন্তর শ্রেণি না হয় কোনও শ্রেণি বা প্যাকেজের সদস্য না, এটি অ্যাক্সেস স্তর দিয়ে ঘোষণা করা হয় না। (তবে পরিষ্কার হয়ে নিন যে এর নিজস্ব সদস্যদের সাধারণ শ্রেণির মতো অ্যাক্সেসের স্তর রয়েছে have)


আমি উল্লেখ করেছি যে "এটিকে ব্যক্তিগত সদস্য হিসাবে না রেখে"

6

ওয়েল, জাভাতে, একটি পরিবর্তনশীল চূড়ান্ত হতে পারে কেবলমাত্র পরামিতি হিসাবে নয়, তবে একটি শ্রেণি-স্তরের ক্ষেত্রের মতো like

public class Test
{
 public final int a = 3;

বা স্থানীয় ভেরিয়েবল হিসাবে, পছন্দ

public static void main(String[] args)
{
 final int a = 3;

আপনি যদি কোনও বেনাম শ্রেণীর থেকে কোনও ভেরিয়েবল অ্যাক্সেস এবং সংশোধন করতে চান তবে আপনি ভেরিয়েবলটি বদ্ধ শ্রেণিতে একটি শ্রেণি-স্তরের ভেরিয়েবল বানাতে চাইতে পারেন ।

public class Test
{
 public int a;
 public void doSomething()
 {
  Runnable runnable =
   new Runnable()
   {
    public void run()
    {
     System.out.println(a);
     a = a+1;
    }
   };
 }
}

চূড়ান্ত হিসাবে আপনার কোনও ভেরিয়েবল থাকতে পারে না এবং এটি একটি নতুন মান দিতে পারে। finalএর অর্থ কেবল এটি: মানটি অপরিবর্তনীয় এবং চূড়ান্ত।

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

এটি কেবলমাত্র আপনার বেনাম শ্রেণীর নামক একটি অন্তর্নিহিত ইনট এর মানটির অনুলিপি করে।


3
আমি এর সাথে "ক্লাস-লেভেল ভেরিয়েবল" যুক্ত করি static। আপনি যদি এর পরিবর্তে "ইনস্ট্যান্স ভেরিয়েবল" ব্যবহার করেন তবে এটি আরও পরিষ্কার।
এলজেনসো

1
ভাল, আমি ক্লাস-লেভেল ব্যবহার করেছি কারণ কৌশলটি উদাহরণ এবং স্থির ভেরিয়েবল উভয়ের সাথেই কাজ করবে।
জ্যাচ এল

আমরা ইতিমধ্যে জানি যে চূড়ান্ত অ্যাক্সেসযোগ্য তবে আমরা জানতে চাই কেন? আপনি দয়া করে কেন আরও কিছু ব্যাখ্যা যুক্ত করতে পারেন?
সৌরভ ওজা

6

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


এটি সি # এর মতো ভাষায় এটি কীভাবে প্রয়োগ করা হয় যা এই বৈশিষ্ট্যটিকে সমর্থন করে। প্রকৃতপক্ষে, সংকলকটি স্থানীয় ভেরিয়েবল থেকে ভেরিয়েবলকে একটি উদাহরণ ভেরিয়েবলে পরিবর্তন করে, বা এটি এই ভেরিয়েবলগুলির জন্য একটি অতিরিক্ত ডেটা কাঠামো তৈরি করে যা বাইরের শ্রেণীর ক্ষেত্রকে বহির্গত করতে পারে। যাইহোক, "স্থানীয় ভেরিয়েবলগুলির একাধিক অনুলিপি" নেই
মাইক 76

মাইক 7676 আমি সি # এর বাস্তবায়নের দিকে নজর রাখিনি, তবে স্কালা দ্বিতীয়টি বলেছিল যা আপনি উল্লেখ করেছেন আমি মনে করি: যদি কোনও Intবন্ধের ভিতরে পুনর্নির্দিষ্ট করা হয়, তবে সেই পরিবর্তনশীলটিকে IntRef(মূলত একটি মিউটেবল Integerর‌্যাপার) উদাহরণে পরিবর্তন করুন । প্রতিটি ভেরিয়েবল অ্যাক্সেসের পরে সেই অনুযায়ী নতুন করে লেখা হয়।

3

এই সীমাবদ্ধতার যৌক্তিকতা বুঝতে, নিম্নলিখিত প্রোগ্রামটি বিবেচনা করুন:

public class Program {

    interface Interface {
        public void printInteger();
    }
    static Interface interfaceInstance = null;

    static void initialize(int val) {
        class Impl implements Interface {
            @Override
            public void printInteger() {
                System.out.println(val);
            }
        }
        interfaceInstance = new Impl();
    }

    public static void main(String[] args) {
        initialize(12345);
        interfaceInstance.printInteger();
    }
}

InterfaceInstance পর মেমরি রয়ে আরম্ভ পদ্ধতি আয় কিন্তু প্যারামিটার Val না। জেভিএম তার আওতার বাইরে একটি স্থানীয় পরিবর্তনশীল অ্যাক্সেস করতে পারছি না, তাই জাভা পরবর্তী কল তোলে printInteger মান অনুলিপি করে কাজ Val মধ্যে একই নামের একটি অন্তর্নিহিত ক্ষেত্রের interfaceInstanceInterfaceInstance আছে বলা হয় বন্দী স্থানীয় প্যারামিটারের মান। যদি প্যারামিটারটি চূড়ান্ত না হয় (বা কার্যকরভাবে চূড়ান্ত হয়) তবে এর মানটি পরিবর্তিত হতে পারে, ক্যাপচারিত মানটির সাথে সিঙ্কের বাইরে চলে যাওয়ার ফলে সম্ভাব্যভাবে অনিচ্ছাকৃত আচরণের কারণ ঘটায়।


2

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


2

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

( http://en.wikedia.org/wiki/Final_%28 জাভা ৯৯৯ )


1
private void f(Button b, final int a[]) {

    b.addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            a[0] = a[0] * 5;

        }
    });
}

0

হিসাবে জন হয়েছে বাস্তবায়ন বিবরণ উত্তর একটি অন্যান্য সম্ভাব্য উত্তর হতে হবে জেভিএম রেকর্ড যে, তার অ্যাক্টিভেশন শেষ লিখতে হ্যান্ডেল করতে চায় না।

ব্যবহারের ক্ষেত্রে বিবেচনা করুন যেখানে আপনার ল্যাম্বডাস প্রয়োগের পরিবর্তে কোনও জায়গায় সংরক্ষণ করা হয় এবং পরে চালানো হয়।

আমার মনে আছে স্মলটাল্কে আপনি যখন এই জাতীয় পরিবর্তন করেন তখন আপনি একটি অবৈধ স্টোর উত্থাপন করতে পারেন।


0

এই কোডটি ব্যবহার করে দেখুন,

অ্যারে তালিকা তৈরি করুন এবং এর মধ্যে মান রাখুন এবং এটি ফিরিয়ে দিন:

private ArrayList f(Button b, final int a)
{
    final ArrayList al = new ArrayList();
    b.addClickHandler(new ClickHandler() {

         @Override
        public void onClick(ClickEvent event) {
             int b = a*5;
             al.add(b);
        }
    });
    return al;
}

কোনও কিছু কেন প্রয়োজন তা ওপি জিজ্ঞাসা করছে। সুতরাং আপনার কোডটি এটি কীভাবে সম্বোধন করছে তা আপনার নির্দেশ করা উচিত
নিতিনসিংহ

0

জাভা বেনাম শ্রেণীর জাভাস্ক্রিপ্ট বন্ধের সাথে খুব মিল, তবে জাভা বিভিন্নভাবে এটি প্রয়োগ করে। (অ্যান্ডারসনের উত্তর পরীক্ষা করুন)

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

নীচে জাভাস্ক্রিপ্ট উদাহরণটি দেখুন:

var add = (function () {
  var counter = 0;

  var func = function () {
    console.log("counter now = " + counter);
    counter += 1; 
  };

  counter = 100; // line 1, this one need to be final in Java

  return func;

})();


add(); // this will print out 100 in Javascript but 0 in Java

জাভাস্ক্রিপ্টে, counterমানটি 100 হবে, কারণ counterপ্রথম থেকে শেষ পর্যন্ত কেবলমাত্র একটি পরিবর্তনশীল।

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

সুতরাং অভ্যন্তরীণ বস্তু তৈরির পরে কোনও পরিবর্তন (যেমন লাইন 1), এটি অভ্যন্তরীণ বস্তুকে প্রভাবিত করবে না। সুতরাং এটি দুটি পৃথক ফলাফল এবং আচরণের (জাভা এবং জাভাস্ক্রিপ্টের মধ্যে) মধ্যে বিভ্রান্তি তৈরি করবে।

আমি বিশ্বাস করি সে কারণেই, জাভা এটিকে চূড়ান্ত হতে বাধ্য করার সিদ্ধান্ত নিয়েছে, তাই ডেটা শুরু থেকে শেষ পর্যন্ত 'সামঞ্জস্যপূর্ণ'।


0

একটি অভ্যন্তর শ্রেণীর ভিতরে জাভা চূড়ান্ত পরিবর্তনশীল

অভ্যন্তর শ্রেণি কেবল ব্যবহার করতে পারে

  1. বাইরের শ্রেণি থেকে রেফারেন্স
  2. সুযোগের বাইরে চূড়ান্ত স্থানীয় ভেরিয়েবলগুলি যা একটি রেফারেন্স টাইপ (যেমন Object...)
  3. মান (আদিম) (যেমন int...) প্রকারটি একটি চূড়ান্ত রেফারেন্স টাইপ দিয়ে মোড়ানো যায়IntelliJ IDEAআপনাকে এটিকে একটি উপাদান অ্যারেতে প্রচ্ছন্ন করতে সহায়তা করতে পারে

যখন একটি non static nested( inner class) [সম্পর্কে] সংকলক দ্বারা উত্পাদিত হয় - একটি নতুন শ্রেণি - <OuterClass>$<InnerClass>.classতৈরি করা হয় এবং আবদ্ধ পরামিতিগুলি কনস্ট্রাক্টরে পাস করা হয় [স্ট্যাকের স্থানীয় ভেরিয়েবল] । এটি বন্ধের মতো

চূড়ান্ত পরিবর্তনশীল একটি পরিবর্তনশীল যা পুনরায় সাইন করা যাবে না। চূড়ান্ত রেফারেন্স পরিবর্তনশীল এখনও একটি রাষ্ট্র পরিবর্তন করে পরিবর্তন করা যেতে পারে

এটি সম্ভব ছিল এটি অদ্ভুত হবে কারণ প্রোগ্রামার হিসাবে আপনি এটি তৈরি করতে পারেন

//Not possible 
private void foo() {

    MyClass myClass = new MyClass(); //address 1
    int a = 5;

    Button button = new Button();

    //just as an example
    button.addClickHandler(new ClickHandler() {


        @Override
        public void onClick(ClickEvent event) {

            myClass.something(); //<- what is the address ?
            int b = a; //<- 5 or 10 ?

            //illusion that next changes are visible for Outer class
            myClass = new MyClass();
            a = 15;
        }
    });

    myClass = new MyClass(); //address 2
    int a = 10;
}

-2

হয়তো এই কৌশলটি আপনাকে একটি ধারণা দেয়

Boolean var= new anonymousClass(){
    private String myVar; //String for example
    @Overriden public Boolean method(int i){
          //use myVar and i
    }
    public String setVar(String var){myVar=var; return this;} //Returns self instane
}.setVar("Hello").method(3);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.