এটি স্ট্যাটিক ব্লকের কেবল স্থির ক্ষেত্রগুলিতে অ্যাক্সেস রয়েছে তা ভাবা একটি সাধারণ ভুল ধারণা। এর জন্য আমি নীচে কোডের কিছু অংশটি প্রদর্শন করতে চাই যা আমি প্রায়শই বাস্তব জীবনের প্রকল্পগুলিতে ব্যবহার করি ( কিছুটা ভিন্ন প্রসঙ্গে অন্য উত্তর থেকে আংশিকভাবে অনুলিপি করা হয় ):
public enum Language {
ENGLISH("eng", "en", "en_GB", "en_US"),
GERMAN("de", "ge"),
CROATIAN("hr", "cro"),
RUSSIAN("ru"),
BELGIAN("be",";-)");
static final private Map<String,Language> ALIAS_MAP = new HashMap<String,Language>();
static {
for (Language l:Language.values()) {
// ignoring the case by normalizing to uppercase
ALIAS_MAP.put(l.name().toUpperCase(),l);
for (String alias:l.aliases) ALIAS_MAP.put(alias.toUpperCase(),l);
}
}
static public boolean has(String value) {
// ignoring the case by normalizing to uppercase
return ALIAS_MAP.containsKey(value.toUpper());
}
static public Language fromString(String value) {
if (value == null) throw new NullPointerException("alias null");
Language l = ALIAS_MAP.get(value);
if (l == null) throw new IllegalArgumentException("Not an alias: "+value);
return l;
}
private List<String> aliases;
private Language(String... aliases) {
this.aliases = Arrays.asList(aliases);
}
}
এখানে ইনিশিয়ালাইজারটি মূল সূচিপত্র ALIAS_MAP
টাইপটিতে ফিরে এলিয়াসের সেট ম্যাপ করতে একটি সূচক ( ) বজায় রাখতে ব্যবহৃত হয় । এটি Enum
নিজের দ্বারা সরবরাহিত অন্তর্নির্মিত মানটি পদ্ধতিতে একটি এক্সটেনশন হিসাবে অভিযুক্ত ।
আপনি দেখতে পাচ্ছেন, স্থির আরম্ভকারী এমনকি private
ক্ষেত্রটিও অ্যাক্সেস করে aliases
। এটি বুঝতে গুরুত্বপূর্ণ যে static
ব্লকের ইতিমধ্যে Enum
মান উদাহরণগুলি অ্যাক্সেস রয়েছে (উদাঃ ENGLISH
)। এটি কারণ হিসাবে আরম্ভের আদেশ কার্যকর করার ক্ষেত্রেEnum
ধরনের , শুধু যেন static private
ক্ষেত্র দৃষ্টান্ত সঙ্গে সক্রিয়া করা হয়েছে সামনে static
ব্লক নামক করা হয়েছে:
- দ্য
Enum
স্থির ক্ষেত্রগুলি। এটির জন্য এনাম কনস্ট্রাক্টর এবং দৃষ্টান্তের ব্লকগুলির প্রয়োজন হয় এবং প্রথমে হ'ল ইনস্ট্যান্সের সূচনাও।
static
সংঘবদ্ধতার ক্রমে স্থির ক্ষেত্রগুলির ব্লক এবং সূচনা initial
এই আউট-অফ-অর্ডার ইনিশিয়ালেশন ( static
ব্লকের আগে কনস্ট্রাক্টর ) নোট করা গুরুত্বপূর্ণ। এটি যখন ঘটে তখন আমরা স্থির ক্ষেত্রগুলিকে সিঙ্গলটনের অনুরূপ উদাহরণগুলি দিয়ে তৈরি করি (সরলীকরণ তৈরি করা হয়):
public class Foo {
static { System.out.println("Static Block 1"); }
public static final Foo FOO = new Foo();
static { System.out.println("Static Block 2"); }
public Foo() { System.out.println("Constructor"); }
static public void main(String p[]) {
System.out.println("In Main");
new Foo();
}
}
আমরা যা দেখি তা হ'ল নিম্নলিখিত আউটপুটটি:
Static Block 1
Constructor
Static Block 2
In Main
Constructor
পরিষ্কার যে স্থির সূচনা আসলে আগে হতে পারে কনস্ট্রাক্টরের এবং তার পরেও :
কেবলমাত্র মূল পদ্ধতিতে ফু-এ অ্যাক্সেসের ফলে ক্লাসটি লোড হয়ে যায় এবং স্থিতিশীল শুরু হয়। স্ট্যাটিক ইনিশিয়ালাইজের অংশ হিসাবে আমরা আবার স্ট্যাটিক ক্ষেত্রগুলির জন্য কনস্ট্রাক্টরকে কল করি, তারপরে এটি স্থির সূচনা পুনরায় শুরু করে এবং মূল পদ্ধতির মধ্যে থেকে ডাকা কন্সট্রাক্টরকে সম্পূর্ণ করে। বরং জটিল পরিস্থিতি যার জন্য আমি আশা করি যে সাধারণ কোডিংয়ে আমাদের মোকাবেলা করতে হবে না।
এ সম্পর্কিত আরও তথ্যের জন্য " কার্যকর জাভা " বইটি দেখুন ।
{...}
বনামstatic {...}
। (এই ক্ষেত্রে জোন স্কিটি আপনার প্রশ্নের উত্তর অবশ্যই ভাল দিয়েছিল)