কিছু লোক জিজ্ঞাসা করেছেন: সিঙ্গলটন কীভাবে নাল পয়েন্টার ফিরিয়ে দিতে পারে?
আমি এই প্রশ্নের উত্তর দিচ্ছি। (আমি কোনও মন্তব্যে উত্তর দিতে পারি না কারণ আমার কোড পোস্ট করা দরকার))
এটি দুটি ইভেন্টের মধ্যে শূন্য হতে পারে: (1) শ্রেণিটি লোড হয় এবং (2) এই শ্রেণীর অবজেক্ট তৈরি হয় is এখানে একটি উদাহরণ:
class X {
static X xinstance;
static Y yinstance = Y.yinstance;
X() {xinstance=this;}
}
class Y {
static X xinstance = X.xinstance;
static Y yinstance;
Y() {yinstance=this;}
}
public class A {
public static void main(String[] p) {
X x = new X();
Y y = new Y();
System.out.println("x:"+X.xinstance+" y:"+Y.yinstance);
System.out.println("x:"+Y.xinstance+" y:"+X.yinstance);
}
}
কোডটি চালাও:
$ javac A.java
$ java A
x:X@a63599 y:Y@9036e
x:null y:null
দ্বিতীয় লাইন অনুষ্ঠান Y.xinstance এবং X.yinstance হয় নাল ; তারা নাল কারণ ভেরিয়েবল X.xinstance উত্তর Y.yinstance পাঠ করা হয় যখন তারা নাল ছিল।
এটি কি স্থির করা যায়? হ্যাঁ,
class X {
static Y y = Y.getInstance();
static X theinstance;
static X getInstance() {if(theinstance==null) {theinstance = new X();} return theinstance;}
}
class Y {
static X x = X.getInstance();
static Y theinstance;
static Y getInstance() {if(theinstance==null) {theinstance = new Y();} return theinstance;}
}
public class A {
public static void main(String[] p) {
System.out.println("x:"+X.getInstance()+" y:"+Y.getInstance());
System.out.println("x:"+Y.x+" y:"+X.y);
}
}
এবং এই কোডটি কোনও অসঙ্গতি দেখায় না:
$ javac A.java
$ java A
x:X@1c059f6 y:Y@152506e
x:X@1c059f6 y:Y@152506e
তবে এটি অ্যান্ড্রয়েড Application
অবজেক্টের জন্য কোনও বিকল্প নয় : প্রোগ্রামার তৈরি হওয়ার সময় নিয়ন্ত্রণ করে না।
আবার: প্রথম উদাহরণ এবং দ্বিতীয়টির মধ্যে পার্থক্য হ'ল স্থির পয়েন্টারটি শূন্য হলে দ্বিতীয় উদাহরণটি উদাহরণ তৈরি করে। কিন্তু একটি প্রোগ্রামার তৈরি করতে পারবেন না Android অ্যাপ্লিকেশান বস্তুর সামনে সিস্টেম এটা করতে সিদ্ধান্ত নেয়।
হালনাগাদ
আর একটি চমকপ্রদ উদাহরণ যেখানে প্রারম্ভিক স্ট্যাটিক ক্ষেত্রগুলি ঘটে null
।
মাইন.জভা :
enum MyEnum {
FIRST,SECOND;
private static String prefix="<", suffix=">";
String myName;
MyEnum() {
myName = makeMyName();
}
String makeMyName() {
return prefix + name() + suffix;
}
String getMyName() {
return myName;
}
}
public class Main {
public static void main(String args[]) {
System.out.println("first: "+MyEnum.FIRST+" second: "+MyEnum.SECOND);
System.out.println("first: "+MyEnum.FIRST.makeMyName()+" second: "+MyEnum.SECOND.makeMyName());
System.out.println("first: "+MyEnum.FIRST.getMyName()+" second: "+MyEnum.SECOND.getMyName());
}
}
এবং আপনি পাবেন:
$ javac Main.java
$ java Main
first: FIRST second: SECOND
first: <FIRST> second: <SECOND>
first: nullFIRSTnull second: nullSECONDnull
নোট করুন যে আপনি স্থিতিশীল ভেরিয়েবল ডিক্লেয়ারেশনটিকে এক লাইন উপরের দিকে সরাতে পারবেন না, কোডটি সংকলন করবে না।
<application>
আপনার AndroidManifest.xml ফাইলের নোড নিম্নলিখিত বৈশিষ্ট্য সংজ্ঞা অন্তর্ভুক্ত করা:android:name="MyApp"
। মাই অ্যাপটি একই প্যাকেজের অধীনে থাকা দরকার যা আপনার ম্যানিফেস্ট উল্লেখ করে।