জাভা: স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লক কখন কার্যকর হয়?


91

একটি staticব্লকের মধ্যে আরম্ভের মধ্যে পার্থক্য কী :

public class staticTest {

    static String s;
    static int n;
    static double d;

    static {
        s = "I'm static";
        n = 500;
        d = 4000.0001;
    }
    ...

এবং পৃথক স্থিতিশীল সূচনা:

public class staticTest {

    static String s = "I'm static";
    static int n    = 500;
    static double d = 4000.0001;

    ....

4
আপনি কেবল স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লকে অ্যাসাইনমেন্ট ব্যবহার করছেন, অবশ্যই স্ট্যাটিক ভেরিয়েবল অ্যাসাইনমেন্ট ব্যবহার করে এটি করা যেতে পারে। আপনি কি অ্যাসাইনমেন্টের বিবৃতিগুলি কার্যকর করার প্রয়োজন হলে কি হয় দেখার চেষ্টা করেছেন?
প্ল্যাটিনাম আউজুরে

ক্লাস লোড করা বা নেটিভ লাইব্রেরি লোড করার জন্য এটি ভাল জায়গা।
qrtt1

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

উত্তর:


106

একটি স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লক আরও জটিল সূচনা করার অনুমতি দেয়, উদাহরণস্বরূপ শর্তাদি ব্যবহার করে:

static double a;
static {
    if (SomeCondition) {
      a = 0;
    } else {
      a = 1;
    }
}

বা যখন কেবলমাত্র নির্মাণের চেয়ে আরও বেশি প্রয়োজন হয়: আপনার উদাহরণ তৈরি করতে কোনও বিল্ডার ব্যবহার করার সময়, ব্যতিক্রম হ্যান্ডলিং বা স্ট্যাটিক ক্ষেত্রগুলি তৈরি করা ছাড়া অন্য কাজ করা প্রয়োজনীয়।

একটি স্ট্যাটিক ইনিশিয়েলাইজেশন ব্লক ইনলাইন স্ট্যাটিক ইনিশিয়ালাইজারগুলির পরেও চলে, সুতরাং নিম্নলিখিতটি বৈধ:

static double a;
static double b = 1;

static {
    a = b * 4; // Evaluates to 4
}

4
"খ = এ * 4;" করছেন; ইনলাইন কেবল তখনই সমস্যা হতে পারে খ কে ক এর আগে ঘোষনা করা হয়েছিল যা আপনার উদাহরণের ক্ষেত্রে নয়।
জর্জ হকিন্স

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

4
কেবল মজাদার জন্য আমি উল্লেখ করতে পারি যে আপনার প্রথম উদাহরণটি খুব সহজেই "স্থিতিশীল ডাবল এ = কিছু শর্ত? 0: 1;" আপনার উদাহরণগুলি দুর্দান্ত নয়, আমি কেবল বলি ... :)
বিল কে

18

একটি সাধারণ ব্যবহার:

private final static Set<String> SET = new HashSet<String>();

static {
    SET.add("value1");
    SET.add("value2");
    SET.add("value3");
}

স্ট্যাটিক ইনিশিয়ালাইজার ছাড়া আপনি কীভাবে এটি করবেন?



4
অতিরিক্ত লাইব্রেরি ছাড়া অন্য উত্তর: একটি স্থিতিশীল পদ্ধতি তৈরি করুন SETযা ভেরিয়েবল ইনিশিয়ালাইজার ( private final static Set<String> SET = createValueSet()) এর আরম্ভকে আবদ্ধ করে । যদি আপনার কাছে 5 টি সেট এবং 2 টি মানচিত্র থাকে তবে আপনি কেবল সেগুলি সমস্ত একক staticব্লকে ফেলে দিতে পারেন?
TWiStErRob অক্টোব

14

আপনি static{}নীচের মত ভিতরে ভিতরে চেষ্টা / ক্যাচ ব্লক ব্যবহার করতে পারেন :

MyCode{

    static Scanner input = new Scanner(System.in);
    static boolean flag = true;
    static int B = input.nextInt();
    static int H = input.nextInt();

    static{
        try{
            if(B <= 0 || H <= 0){
                flag = false;
                throw new Exception("Breadth and height must be positive");
            }
        }catch(Exception e){
            System.out.println(e);
        }

    }
}

দ্রষ্টব্য থেকে রেফার এই !


11

আরম্ভের সময় ব্যতিক্রম হ্যান্ডলিং অন্য কারণ another উদাহরণ স্বরূপ:

static URL url;
static {
    try {
        url = new URL("https://blahblah.com");
    }
    catch (MalformedURLException mue) {
        //log exception or handle otherwise
    }
}

এটি নির্মাণকারীদের জন্য দরকারী যা উপরোক্ত মতো বিরক্তিকরভাবে চেক করা ব্যতিক্রমগুলি ফেলে দেয় বা অন্যথায় জটিল জটিল সূচনা যুক্তি যা ব্যতিক্রম-প্রবণ হতে পারে।


5

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


4

আপনার উদাহরণে, কোনও পার্থক্য নেই; তবে প্রায়শই প্রাথমিক মানটি একটি একক অভিব্যক্তিতে স্বাচ্ছন্দ্যের সাথে প্রকাশের চেয়ে জটিল হয় (যেমন, এটি এমন একটি List<String>যা এর forসামগ্রীতে একটি- লুপ দ্বারা সর্বোত্তমভাবে প্রকাশ করা হয় ; বা এটি এমন কোনও Methodঅস্তিত্ব নাও থাকতে পারে, তাই ব্যতিক্রম হ্যান্ডলারের প্রয়োজন হয়), এবং / অথবা স্থির ক্ষেত্রগুলিকে একটি নির্দিষ্ট ক্রমে সেট করা দরকার।


4

staticসিঙ্ক্রোনাইজড মেথড ব্যবহার রোধ করতে, ব্লকটি সিঙ্গলটন উদাহরণটি শুরু করতে ব্যবহার করা যেতে পারে । getInstance()


3

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

অবশ্যই, আমি প্রায়শই আমার স্ট্যাটিকস তৈরি করতাম finalএবং একটি অমার্জনীয়যোগ্য বস্তুর দিকে নির্দেশ করতাম ।


3

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

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

উদাহরণ:

    class Shoe {
    int size;
    String colour;
    static String brand = "Nike";

    public Shoe(int size, String colour) {
        super();
        this.size = size;
        this.colour = colour;
    }

    void displayShoe() {
        System.out.printf("%-2d %-8s %s %n",size,colour, brand);
    }

    public static void main(String args[]) {
        Shoe s1 = new Shoe(7, "Blue");
        Shoe s2 = new Shoe(8, "White");

        System.out.println("=================");
        s1.displayShoe();
        s2.displayShoe();
        System.out.println("=================");
    }
}

1

আমরা আমাদের ইনস্ট্যান্স ভেরিয়েবল (অ স্ট্যাটিক ভেরিয়েবল, ভেরিয়েবল যা অবজেক্টের অন্তর্ভুক্ত, ক্লাস নয়) আরম্ভ করার জন্য কনস্ট্রাক্টর ব্যবহার করি।

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

static Scanner input = new Scanner(System.in);
static int widht;
static int height;

static
{
    widht = input.nextInt();
    input.nextLine();
    height = input.nextInt();
    input.close();

    if ((widht < 0) || (height < 0))
    {
        System.out.println("java.lang.Exception: Width and height must be positive");
    }
    else
    {
        System.out.println("widht * height = " + widht * height);
    }
}

একটি স্ট্যাটিক ইনিশিয়ালাইজারে স্টিডিন পড়া খুব ভয়ঙ্কর ধারণা। এবং System.out.println("B * H");বেশ অকেজো। এবং উত্তর নিজেই বেশ অস্পষ্ট। ওপি নির্মাণকারী বা উদাহরণ ভেরিয়েবলগুলির উল্লেখ করেনি।
shmosel

এটি কেবলমাত্র একটি উদাহরণ যা এটি স্ট্যাটিক ইনিশিয়ালাইজার কী এবং এটি কীভাবে ব্যবহৃত হয় তা দেখায়। ওপি কন্সট্রাক্টর বা ইনস্ট্যান্স ভেরিয়েবলের কথা জিজ্ঞাসা করেনি তবে তাকে নির্মাণকারীর কাছ থেকে স্ট্যাটিক ইনিশিয়ালাইজারের পার্থক্য শেখানোর জন্য তাকে এটি জানতে হবে। অন্যথায় তিনি বলতেন "কেন আমি আমার স্থির ভেরিয়েবলগুলি আরম্ভ করার জন্য কোনও কনস্ট্রাক্টর ব্যবহার করি না?"
মাইকেল

0

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

আরো নির্দিষ্টভাবে,

static final String ab = a+b;
static final String a = "Hello,";
static final String b = ", world";

কাজ করবে না কারণ a এবং b ab এর পরে ঘোষিত হয়েছে।

তবে আমি একটি স্ট্যাটিক init ব্যবহার করতে পারি। এটি কাটিয়ে উঠতে ব্লক করুন

static final String ab;
static final String a;
static final String b;

static {
  b = ", world";
  a = "Hello";
  ab = a + b;
}

static final String ab;
static final String a;
static final String b;

static {
  b = (...) ? ", world" : ", universe";
  a = "Hello";
  ab = a + b;
}

4
আপনি যা বলছেন তা সত্য, এটি স্ট্যাটিক ইনিশিয়ালাইজার ব্লকের প্রয়োজনীয়তা প্রদর্শন করে না। আপনি কেবল abঘোষণার নীচে আপনার ঘোষণাকে সরিয়ে নিতে পারেন b
গাভি

0

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


0

ক্লাস লোড করার সময় আপনি যখন কোনও নির্দিষ্ট অভিব্যক্তি মূল্যায়ন করতে চান তখন আপনি স্থির ব্লকটি ব্যবহার করতে পারেন তবে মনে রাখবেন:

আপনি অবশ্যই স্ট্যাটিক ব্লকে একটি ব্যতিক্রম হ্যান্ডেল করতে পারবেন অর্থাত আপনি স্ট্যাটিক ব্লক থেকে ব্যতিক্রম ছুঁড়ে ফেলতে পারবেন না।

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