Pages

Thursday, August 16, 2012

ජාවාහි Singleton Objects ගැන දැන ගනිමු. What are Singleton objects in java programming language

                 අද කථා කරන්න යන්නේ ජාවා පාඩමක් පිළිබඳවයි. තරමක් දුරට ජාවා ගැන අවබෝධය ඇති කෙනෙක්ට මෙම ලිපිය වැදගත් වේවි. ඒ නැතත් බොහෝ සරල ලෙස පැහැදිලි කරන්නට උත්සාහ කරන්නම්. මේ සඳහා ඔබට OOP (Object Oriented Programming)පිළිබඳ තරමක් දුරට අවබෝධය අවශ්‍ය කරනවා. ජාවා දන්න බොහෝ දෙනෙක් OOP ගැනද දන්නවාට සැකයක් නෑ. ජාවාහි Object 1 යනු සත්‍ය ලෝකයේ වස්තුවකට සමාන කරන ලද වස්තුවක් ලෙස හඳුන්වන්න පුළුවන්. එයට ගති ගුණ ( properties ) උදා වර්ණය, ප්‍රමාණය මෙන්ම හැසිරීම් ( behaviors ) ද තිබෙනවා. උදා: වස්තුව කාරයක් නම් කාරය ගමන් කරයි, කාරයේ රෝද කැරකෙයි. මෙම වස්තූන් විවිධ ලෙස හැසිරීමෙන් විවිධ ක්‍රියාකාරකම් කල හැකියි. ඔබ ජාවා වලට ආධුනිකයෙක් නම් ගැන වැඩි විස්තර මෙම ලිපි පෙළ කියවීමෙන් ලබා ගත හැකියි. 





   විවිධ වැඩසටහන් වලදී බොහෝ අතුරුමුහුණත් වලින් එක් තැනකට තොරතුරු යවා ගබඩා කර ගැනීමටත් ඒවා වැඩසටහන ක්‍රියාත්මක වන වේලාවේදී සුරැකිව නොවෙනස්ව තබා ගැනීමටත් අවශ්‍ය විටෙක ඕනෑම තැනක සිට එම තොරතුරු නැවත ලබා ගැනීමටත් සිදු වෙන අවස්ථා තිබෙනවා. උදාහරණයක් ලෙස යම් වැඩසටහනක් ක්‍රියාත්මකව තබා ගැනීමට අවශ්‍ය විධාන මතකයේ නිතරම තබා ගැනීමට අවශ්‍ය වෙනවා. එවැනි අවස්ථා වලදී තොරතුරු ගබඩා කර ගත හැකි ක්‍රමයක් වශ්‍ය වෙනවා. සාමාන්‍ය object එකක් මෙහිදී භාවිතයට ගත හැකි නැහැ. එම Object වල ඇතුලත් තොරතුරු (Values) නිතරම වෙනස් වනවා මෙන්ම එම එකෙහි එක අගය සාදන object එක මත රඳා පවතිනවා. 

  එනම් විවිධ ස්ථාන වලදී සාදන වල අගයන් එම වලටම සීමා වන අතරම නැවත වෙනත් හරහා කලින් එකෙහි තොරතුරු ලබා ගත නොහැකි. එය පහත ආකරයට සරල ජාවා කේතයන් මඟින් දැක්විය හකියි. මෙහිදී අප String වශයෙන් අපගේ තොරතුරු ගබඩා කර ගැනීමට අවශ්‍ය යැයි සලකමු. නමුත් මේ සඳහා ඔබට අවශ්‍ය ඕනෑම ආකාරයක Data type 1 භාවිතා කල හැකියි.

මුලින්ම එකිනෙකට වෙනස් 3 class 3 සාදා ගනිමු. මෙහි A යනු අපගේ තොරතුරු ගබඩා කරන class එකයි. B class එක තොරතුරු A class එකට මුදා හරින class එක ලෙසද C class එක තොරතුරු නැවත ලබා ගන්නා class එක ලෙසද සලකමු.



class A {

    String firstname, lastname;

    public void setvalues(String f, String l) {

        firstname = f;
        lastname = l;
    }

    public String getlastname() {

        return lastname;
    }

    public String getfirstname() {

        return firstname;
    }
}

class B {

    public static void main(String[] args) {
        A ob = new A();
        ob.setvalues("Pubudu", "Nawarathna");
        System.out.println(ob.getfirstname());
        System.out.println(ob.getlastname());
        new C().print();
    }
}

class C {

    public void print() {
        A ob = new A();

        System.out.println(ob.getfirstname());
        System.out.println(ob.getlastname());

    }
}


    මෙහිදී B class එකෙන් ලබා දුන් අගයන් C class එකෙන් ලබා ගත නොහැකියි. ඒවා වෙනස් වන සුළුයි. මෙයට විසඳුම කුමක්ද? ඔබට කිව හැකිද? මේ නිසා එම අගයන් ගබඩා කර ගත හැකි විශේෂ Object එකක් සාදන ආකාරය ජාවා ක්‍රමලේඛ භාෂාවේ දක්වා තිබෙනවා. මෙය Singleton යනුවෙන් හඳුන්වනවා. Singleton යනු "තනි අගයක්" යන තේරුම දෙන වචනයකි. ඒ ආකාරයෙන්ම මේ සඳහා එක් වරකට සැපයිය හැක්කේ එක් අගයක් පමණි. ඒවා වෙනස් නොවී නැවත ඕනෑම තැනක සිට ලබා ගත හැකි වෙනවා. දැන් අපි පියවර වශයෙන් මෙවැනි Object එකක් සෑදිය හැකි Class එකක් සාදා ගන්නා ආකාරය බලමු.

    මුලින්ම singleton යනුවෙන් class එකක් නිර්මාණය කර ගනිමු. ඔබට කැමති ඕනෑම නමක් මේ class 1 සඳහා ලබා දිය හැකියි. 

public class singleton {
}

ඉන්පසු එම class එකෙහි constructor එක private ලෙස overload  කර ගත යුතු වෙනවා. මෙයට හේතුව වන්නේ මෙම class එකෙහි objects සෑදීම වැලැක්වීම එනම් instantiate වීම වැලැක්වීමයි.
අගයන් එකිනෙකට වෙනස් වීමට හේතුව වන්නේ class එකෙහි එක වර objects කිහිපයක් සෑදීමට හැකි නිසයි. මෙසේ constructor එක overload කිරීමෙන් instantiate කිරීම වළක්වනවා.

public class singleton {
   private singleton() {
    }
}

/////////////////////////////
private static singleton ref;  නමින් singleton class එකෙහි Reference එකක් සාදා ගත යුතු වෙනවා. එය ref ලෙස නම් කරමු.

මීළඟට කැමති නමකින් public static  method එකක් සාදා ගත යුතු වෙනවා. මෙහිදී setobject() ලෙස method එක සාදා තිබෙනවා. instantiate වීම වැළැක්වූ පසුත් මෙම class එක access කිරීම සඳහා එම method එක public static ලෙස සාදා ගත යුතු වෙනවා. Thread භාවිතයේදී Thread කිහිපයකින් objects සෑදිය හැකි නිසා එය වැළැක්වීමට synchronized key word එක භාවිතා කරනවා. එවිට මෙය Thread Safe ලෙස ක්‍රියා කිරීම අරඹනවා. Return type ලෙස class එක ලබා දිය යුතු වෙනවා. ඉතිරි කේත කිහිපයෙන් වන්නේ මේ method එක හරහා class එකෙහි object එකක් සාදා ගැනීමයි. එය වලංගු වේ. එම නිසා method එක call කරන විට class reference එක return වීම අත්‍යවශ්‍ය කරුණක් ලෙස සැලකිය හැකියි. ඒ අනුව සරලවම බැලුවහොත් හොර පාරකින් classඑකේ object එකක් සාදා ගෙන ඇති බව පෙනී යනවා. එමෙන්ම එය සෑදිය හැකි වන්නේ එක වරක් වීමද විශේෂත්වයකි. එක් වරක්වත් instantiate වී නැති නම් පමණයි ඒ හරහා නව object එකක් සාදා දෙනු ලබන්නේ. 

public class singleton {
   private singleton() {
    }
    public static synchronized singleton setobject() {
        if (ref == null) {
            ref = new singleton();
        }
        return ref;
    }

}

දැන් මූලික අදියර අවසන් පෙර පියවරේ පරිදි අනෙක් දෙක සාදා ගැනීමෙන් අනතුරුව අවසන් කේතය මෙසේ දැක්විය හැකියි.

public class singleton {

    private static singleton ref;
    private String firstname, lastname;

    private singleton() {
    }

    public static synchronized singleton setobject() {
        if (ref == null) {
            ref = new singleton();
        }
        return ref;
    }

    public void setvalues(String f, String l) {

        firstname = f;
        lastname = l;
    }

    public String getfirstname() {

        return firstname;
    }

    public String getlastname() {
        return lastname;

    }
}

class B1 {

    public static void main(String[] args) {
        singleton ob = singleton.setobject();
        ob.setvalues("Pubudu", "Nawarathna");
        System.out.println(ob.getfirstname());
        System.out.println(ob.getlastname());

        new C1().print();

    }
}

class C1 {

    public void print() {
        singleton ob = singleton.setobject();

        System.out.println(ob.getfirstname());
        System.out.println(ob.getlastname());

    }
}

   පෙර උදාහරණයේදී එක් තැනකින් ලබා දුන් අගයන් වෙනත් තැනකදී ලබා ගන්න විට වෙනස් වුවත් මෙම දෙවන උදාහරණයේදී අගයන් වෙනස් නොවන බව පෙනී යනවා. මෙම කාර්යම සියළුම properties static ලෙස නම් කිරීමෙන් කළ හැකි වුවත් එහිදී ආරක්ෂාව පිළිබඳ ගැටළු මෙන්ම විවිධ අපහසුතා ඇති වීමට ප්‍රවණතාවක් පවතී.

1 comment: