সাধারণভাবে, অ-স্ট্যাটিক ইনিশিয়ালাইজার ব্লক ব্যবহার করবেন না (এবং সম্ভবত স্ট্যাটিকগুলি এড়ানোও হবে)।
বিভ্রান্তিকর সিনট্যাক্স
এই প্রশ্নটি দেখে 3 টি উত্তর রয়েছে, তবুও আপনি এই সিনট্যাক্স সহ 4 জনকে বোকা বানিয়েছেন। আমি তাদের মধ্যে একজন ছিলাম এবং আমি 16 বছর ধরে জাভা লিখছি! স্পষ্টতই, সিনট্যাক্সটি সম্ভাব্য ত্রুটির প্রবণতা! আমি এ থেকে দূরে থাকব
দূরবীন নির্মাণকারী
সত্যিকারের সরল স্টাফের জন্য, আপনি এই বিভ্রান্তি এড়াতে "টেলিস্কোপিং" কনস্ট্রাক্টর ব্যবহার করতে পারেন:
public class Test {
private String something;
// Default constructor does some things
public Test() { doStuff(); }
// Other constructors call the default constructor
public Test(String s) {
this(); // Call default constructor
something = s;
}
}
নির্মাতা প্যাটার্ন
প্রতিটি কনস্ট্রাক্টর বা অন্যান্য পরিশীলিত সূচনা শেষে আপনার যদি স্টাফ () করা দরকার হয় তবে সম্ভবত কোনও বিল্ডার প্যাটার্নটি সবচেয়ে ভাল। নির্মাতারা কেন ভাল ধারণা হচ্ছেন তার বেশ কয়েকটি কারণ জোশ ব্লচ তালিকাবদ্ধ করে। নির্মাতারা লেখার জন্য একটু সময় নেন, তবে সঠিকভাবে লিখেছেন, তারা ব্যবহারে আনন্দিত।
public class Test {
// Value can be final (immutable)
private final String something;
// Private constructor.
private Test(String s) { something = s; }
// Static method to get a builder
public static Builder builder() { return new Builder(); }
// builder class accumulates values until a valid Test object can be created.
private static class Builder {
private String tempSomething;
public Builder something(String s) {
tempSomething = s;
return this;
}
// This is our factory method for a Test class.
public Test build() {
Test t = new Test(tempSomething);
// Here we do your extra initialization after the
// Test class has been created.
doStuff();
// Return a valid, potentially immutable Test object.
return t;
}
}
}
// Now you can call:
Test t = Test.builder()
.setString("Utini!")
.build();
স্ট্যাটিক ইনিশিয়ালাইজার লুপস
আমি স্ট্যাটিক ব্যবহার করতাম ইনিশিয়ালাইজারগুলি অনেক তবে মাঝে মাঝে লুপগুলিতে ছুটে যেখানে 2 ক্লাস একে অপরের স্ট্যাটিক ইনিশিয়ালাইজার ব্লকগুলির উপর নির্ভর করে ক্লাস সম্পূর্ণরূপে লোড হওয়ার আগে ডাকা হত। এটি "ক্লাস লোড করতে ব্যর্থ" বা তেমনি অস্পষ্ট ত্রুটি বার্তা তৈরি করেছে। সমস্যাটি কী তা নির্ধারণ করার জন্য আমাকে উত্স নিয়ন্ত্রণে সর্বশেষ জ্ঞাত ওয়ার্কিং সংস্করণের সাথে ফাইলগুলি তুলনা করতে হয়েছিল। মোটেও মজা নেই।
অলস সূচনা
সম্ভবত স্ট্যাটিক ইনিশিয়ালাইজারগুলি যখন কাজ করে তখন পারফরম্যান্স কারণে ভাল হয় এবং খুব বিভ্রান্ত হয় না। তবে সাধারণভাবে, আমি আজকাল স্থিতিশীল আরম্ভকারীদের কাছে অলস সূচনাটিকে প্রাধান্য দিচ্ছি । তারা কী করে তা স্পষ্ট, আমি তাদের সাথে এখনও ক্লাস-লোডিং বাগে প্রবেশ করি নি, এবং তারা আরম্ভকারী পরিস্থিতিতে খুব বেশি ইনিশিয়ালাইজেশন পরিস্থিতিতে কাজ করে।
ডেটা সংজ্ঞা
ডেটা স্ট্রাকচার তৈরির জন্য স্ট্যাটিক ইনিশিয়ালেশনের পরিবর্তে (অন্যান্য উত্তরের উদাহরণের সাথে তুলনা করুন), আমি এখন প্যাগুরোর অপরিবর্তনীয় ডেটা সংজ্ঞা সাহায্যকারী ফাংশন ব্যবহার করি :
private ImMap<String,String> days =
map(tup("mon", "monday"),
tup("tue", "tuesday"),
tup("wed", "wednesday"),
tup("thu", "thursday"),
tup("fri", "friday"),
tup("sat", "saturday"),
tup("sun", "sunday"));
Conculsion
জাভা শুরুর দিকে, কিছু কাজ করার একমাত্র উপায় ছিল ইনিশিয়ালাইজার ব্লক, তবে এখন তারা বিভ্রান্তিকর, ত্রুটিযুক্ত প্রবণ এবং বেশিরভাগ ক্ষেত্রে আরও ভাল বিকল্প (উপরে বর্ণিত) দ্বারা প্রতিস্থাপন করা হয়েছে। আপনি যদি লিগ্যাসি কোডে সেগুলি দেখতে পান তবে তারা প্রাথমিকভাবে ব্লকগুলি সম্পর্কে জানতে আগ্রহী বা তারা একটি পরীক্ষায় উঠে আসে তবে আমি যদি কোড পর্যালোচনা করছিলাম এবং আমি যদি নতুন কোডে একটি দেখতে পেয়েছি তবে আমি আপনাকে কোনটি কেন প্রমাণ করার জন্য জিজ্ঞাসা করব না উপরের বিকল্পগুলি আপনার কোড থাম্বস আপ দেওয়ার আগে উপযুক্ত ছিল।