CodeGym /Java Blog /এলোমেলো /জাভাতে ফাইনাল কীওয়ার্ড সম্পর্কে কথা বলা যাক
John Squirrels
লেভেল 41
San Francisco

জাভাতে ফাইনাল কীওয়ার্ড সম্পর্কে কথা বলা যাক

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

    public final class String {
    }
    
    class SubString extends String { // Compilation error
    }
আমার আরও মনে রাখা উচিত যে চূড়ান্ত সংশোধকটি বিমূর্ত শ্রেণিতে প্রয়োগ করা যাবে না (যাদের কীওয়ার্ড বিমূর্ত রয়েছে), কারণ এগুলি পারস্পরিক একচেটিয়া ধারণা। একটি চূড়ান্ত পদ্ধতির জন্য, পরিবর্তনকারীর অর্থ হল যে পদ্ধতিটি উপশ্রেণীতে ওভাররাইড করা যাবে না। এটি কার্যকর যখন আমরা মূল বাস্তবায়নের পরিবর্তন রোধ করতে চাই।

    public class SuperClass {
        public final void printReport() {
            System.out.println("Report");
        }
    }

    class SubClass extends SuperClass { 
        public void printReport() { //Compilation error
            System.out.println("MyReport");
        }
    }
একটি আদিম প্রকারের ভেরিয়েবলের জন্য, চূড়ান্ত কীওয়ার্ডের অর্থ হল মান, একবার বরাদ্দ করা হলে, পরিবর্তন করা যাবে না। রেফারেন্স ভেরিয়েবলের জন্য, এর মানে হল একটি বস্তু বরাদ্দ করার পরে, আপনি সেই বস্তুর রেফারেন্স পরিবর্তন করতে পারবেন না। এটা গুরুত্বপূর্ণ! রেফারেন্স পরিবর্তন করা যাবে না, কিন্তু বস্তুর অবস্থা পরিবর্তন করা যেতে পারে. জাভা 8 একটি নতুন ধারণা চালু করেছে: কার্যকরভাবে চূড়ান্ত। এটি শুধুমাত্র ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য (পদ্ধতি পরামিতি সহ)। মূল কথা হল চূড়ান্ত কীওয়ার্ডের স্পষ্ট অনুপস্থিতি সত্ত্বেও, ভেরিয়েবলের মান আরম্ভ করার পরে পরিবর্তিত হয় না। অন্য কথায়, চূড়ান্ত কীওয়ার্ডটি একটি সংকলন ত্রুটি ছাড়াই এমন একটি পরিবর্তনশীলে প্রয়োগ করা যেতে পারে। কার্যকরীভাবে চূড়ান্ত ভেরিয়েবলগুলি স্থানীয় ক্লাস (স্থানীয় অভ্যন্তরীণ শ্রেণী), বেনামী শ্রেণী (বেনামী অভ্যন্তরীণ শ্রেণী) এবং স্ট্রীম (স্ট্রিম API) এর ভিতরে ব্যবহার করা যেতে পারে।

        public void someMethod() {
            // In the example below, both a and b are effectively final, since they are assigned values only once:
            int a = 1;
            int b;
            if (a == 2) b = 3;
            else b = 4;
            // c is NOT effectively final since its value changes
            int c = 10;
            c++;
            
            Stream.of(1, 2).forEach(s-> System.out.println(s + a)); // OK
            Stream.of(1, 2).forEach(s-> System.out.println(s + c)); // Compilation error
        }
এবার একটু সাক্ষাৎকার নেওয়া যাক। সর্বোপরি, কোডজিম কোর্সটি সম্পূর্ণ করার লক্ষ্য হল একজন জাভা বিকাশকারী হওয়া এবং একটি আকর্ষণীয় এবং ভাল বেতনের চাকরি খুঁজে পাওয়া। তো, শুরু করা যাক।
  1. চূড়ান্ত ঘোষণা করা হয় যে একটি অ্যারে সম্পর্কে আমরা কি বলতে পারি?

  2. আমরা জানি যে স্ট্রিং ক্লাস অপরিবর্তনীয়: ক্লাস চূড়ান্ত ঘোষণা করা হয়। একটি স্ট্রিং মান একটি চার অ্যারেতে সংরক্ষণ করা হয় যা চূড়ান্ত কীওয়ার্ড দিয়ে চিহ্নিত করা হয়।


public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

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

    
            final int[] array = {1, 2, 3, 4, 5};
            array[0] = 9;	 // OK, because we're changing the contents of the array: {9, 2, 3, 4, 5}
            array = new int[5]; // Compilation error
    
  2. হ্যাঁ আমরা পারি. প্রধান জিনিস হল বস্তুর সাথে ব্যবহার করার সময় কাঁটাযুক্ত চূড়ান্ত কীওয়ার্ডের অর্থ কী তা বোঝা। প্রতিফলন API মান প্রতিস্থাপন করতে ব্যবহার করা যেতে পারে.


import java.lang.reflect.Field;

class B {
    public static void main(String[] args) throws Exception {
        String value = "Old value";
        System.out.println(value);

        // Get the String class's value field
        Field field = value.getClass().getDeclaredField("value");
        // Make it mutable
        field.setAccessible(true);
        // Set a new value
        field.set(value, "CodeGym".toCharArray());

        System.out.println(value);

        /* Output:
         * Old value
         * CodeGym
         */
    }
}
দয়া করে মনে রাখবেন যে আমরা যদি এইভাবে একটি আদিম প্রকারের চূড়ান্ত পরিবর্তনশীল পরিবর্তন করার চেষ্টা করতাম, তাহলে কিছুই ঘটত না। আমি পরামর্শ দিচ্ছি যে আপনি নিজেকে বোঝান: একটি জাভা ক্লাস তৈরি করুন, উদাহরণস্বরূপ, একটি চূড়ান্ত int ক্ষেত্র সহ এবং প্রতিফলন API ব্যবহার করে এর মান পরিবর্তন করার চেষ্টা করুন। সবার জন্য শুভ কামনা!
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION