Java proqramında bir tək nümunə tətbiq etmək üçün effektiv bir yol nədir?

Java proqramında bir tək nümunə tətbiq etmək üçün effektiv bir yol nədir?

748
16 сент. Riyaz Məhəmməd İbrahim tərəfindən təyin olunub 16 sentyabr. 2008-09-16 12:24 '08 at 12:24 pm 2008-09-16 12:24
ответ 31 cavab
  • 1
  • 2

Siyahıdan istifadə edin:

 public enum Foo { INSTANCE; } 

Joshua Bloch, Google I / O 2008-də təsirli Java Reboot -da bu yanaşma izah etdi: video link . Onun təqdimatının 30-32 slideslərinə də baxın ( effective_java_reloaded.pdf ):

Serializable Singleton tətbiq etmək üçün düzgün yol

 public enum Elvis { INSTANCE; private final String[] favoriteSongs = { "Hound Dog", "Heartbreak Hotel" }; public void printFavorites() { System.out.println(Arrays.toString(favoriteSongs)); } } 

Düzenleme: "Effektiv Java" online hissəsi hesabatları:

"Bu yanaşma, ictimaiyyətə açıq sahədə tətbiq olunan yanaşma ilə bərabər funksionaldir, istisna olmaqla, sərbəst seriyalaşdırma texnikasını təmin edir və kompleks seriallaşdırma və ya əks hücumların qarşısında olsa da, bir çox hallara qarşı əla zəmanət verir.Bu yanaşma hələ qəbul olunmayıb; tək-tək həyata keçirirlər .

737
16 сент. 16 Sentyabrda Stephen Denne tərəfindən cavab verildi 2008-09-16 14:31 '08 at 2:31 pm 2008-09-16 14:31

İstifadəyə görə bir neçə "düzgün" cavab var.

Java5 bunun ən yaxşı yolu olduğundan, bir numaralandırmayı istifadə edin:

 public enum Foo { INSTANCE; } 

Pre java5, ən sadə vəziyyət:

 public final class Foo { private static final Foo INSTANCE = new Foo(); private Foo() { if (INSTANCE != null) { throw new IllegalStateException("Already instantiated"); } } public static Foo getInstance() { return INSTANCE; } public Object clone() throws CloneNotSupportedException{ throw new CloneNotSupportedException("Cannot clone instance of this class"); } } 

Kodunu izləyin. Birincisi, sinifin son olmasını istəyirəm. Bu halda, istifadəçilərin final bildirmək üçün final sözü istifadə etdim. Sonra istifadəçilər öz Foo yaratmaq bilməz ki, konstruktor bağlanıb etmək lazımdır. Qurucudan bir istisna atmaq, istifadəçilərin ikinci foo yaratmaq üçün əksini istifadə etmələrinə mane olur. Sonra, tək bir instansiya və public static Foo getInstance() üsulunu almaq üçün public static Foo getInstance() i qaytarmaq üçün private static final Foo sahəsini public static Foo getInstance() . Java spesifikasiyası konstruktorun yalnız sinif ilk dəfə istifadə edildikdə çağırılmasını təmin edir.

Əgər çox böyük bir obyektiniz və ya ağır tikinti kodunuz varsa, başqa mövcud statik metodlar və ya nümunədən əvvəl istifadə edilə biləcək sahələr varsa, və sonra yalnız tənbəl inisiyadan istifadə etmək lazımdır.

border=0

Bir nümunəni yükləmək üçün private static class istifadə edə bilərsiniz. Sonra kodu belə görünür:

 public final class Foo { private static class FooLoader { private static final Foo INSTANCE = new Foo(); } private Foo() { if (FooLoader.INSTANCE != null) { throw new IllegalStateException("Already instantiated"); } } public static Foo getInstance() { return FooLoader.INSTANCE; } } 

Xəttin private static final Foo INSTANCE = new Foo(); yalnız FooLoader sinfi həqiqətən istifadə edildikdə icra edilir, tənbəl instansiya qayğısına qalır və bunun təhlükəsiz bir mövzu olacağına zəmanət verilir.

Niyyətinizi serialize etmək istədiyiniz zaman, serializasiya surətini yaratmadığından əmin olmalısınız.

 public final class Foo implements Serializable { private static final long serialVersionUID = 1L; private static class FooLoader { private static final Foo INSTANCE = new Foo(); } private Foo() { if (FooLoader.INSTANCE != null) { throw new IllegalStateException("Already instantiated"); } } public static Foo getInstance() { return FooLoader.INSTANCE; } @SuppressWarnings("unused") private Foo readResolve() { return FooLoader.INSTANCE; } } 

readResolve() metodu, proqramın əvvəlki işində serialized olsa belə, tək nümunənin qaytarılmasını təmin edir.

223
16 сент. Cavab 16 sentyabrda Roel Spilker tərəfindən verilir 2008-09-16 18:44 '08 at 18:44 'da 2008-09-16 18:44

Disclaimer: Mən bütün gözəl cavabları yekunlaşdırdı və sözlərimdə yazdım.


Singleton tətbiq edərkən bizdə 2 variant var
Lazy yükləmə
2. Erkən yükləmə

Lazy yükləmə bir az yuxarı (bir çox, dürüst olmaq üçün) əlavə edir, belə ki, yalnız çox böyük bir obyekt və ya ağır tikinti kodunuz olduqda istifadə edin. Və nümunə lazım əvvəl istifadə edilə bilər mövcud digər statik üsulları və ya sahələri var, sonra və yalnız sonra tənbəl başlatma istifadə etmək lazımdır. Əks təqdirdə, erkən çəkməni seçmək yaxşı seçimdir.

Singleton tətbiq etmək üçün ən asan yol -

 public class Foo { // It will be our sole hero private static final Foo INSTANCE = new Foo(); private Foo() { if (INSTANCE != null) { // SHOUT throw new IllegalStateException("Already instantiated"); } } public static Foo getInstance() { return INSTANCE; } } 

Hər şey yaxşıdır, erkən yüklənmiş təklüyü istisna olmaqla. Təmiz yüklədiklərindən istifadə edək

 class Foo { // Our now_null_but_going_to_be sole hero private static Foo INSTANCE = null; private Foo() { if (INSTANCE != null) { // SHOUT throw new IllegalStateException("Already instantiated"); } } public static Foo getInstance() { // Creating only when required. if (INSTANCE == null) { INSTANCE = new Foo(); } return INSTANCE; } } 

Bu hələ də yaxşıdır, amma bizim qəhrəman qəhrəmanımızın bir çox istəyən bir neçə pis mövzu ilə tək-tək mübarizə aparmaq üçün sağ qalmayacaq. Beləliklə, onu çoxlu işıqlılıqdan qoruyaq.

 class Foo { private static Foo INSTANCE = null; // TODO Add private shouting constructor public static Foo getInstance() { // No more tension of threads synchronized (Foo.class) { if (INSTANCE == null) { INSTANCE = new Foo(); } } return INSTANCE; } } 

amma qəhrəmanı qorumaq üçün bu əsla əsla deyil! Bu qəhrəmanımıza kömək etmək üçün əlimizdən gələni etməmiz lazım.

 class Foo { // Pay attention to volatile private static volatile Foo INSTANCE = null; // TODO Add private shouting constructor public static Foo getInstance() { if (INSTANCE == null) { // Check 1 synchronized (Foo.class) { if (INSTANCE == null) { // Check 2 INSTANCE = new Foo(); } } } return INSTANCE; } } 

Buna "Double Lock Idiom yoxlayın" deyilir. Dəyişən bəyanatı unutmaq asandır və bunun nəyə görə lazım olduğunu başa düşmək çətindir.
Daha çox məlumat əldə edin: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

İndi biz bir pis mövzuya əminik, amma nə qədər qəddar seriallaşma haqqında? De-serialiaztion yeni bir obyektin yaradılmadığına baxmayaraq əmin olaq

 class Foo implements Serializable { private static final long serialVersionUID = 1L; private static volatile Foo INSTANCE = null; // Rest of the things are same as above // No more fear of serialization @SuppressWarnings("unused") private Object readResolve() { return INSTANCE; } } 

readResolve() metodu, obyektin proqramın əvvəlki işində serialize olmasına baxmayaraq tək nümunənin qaytarılmasını təmin edir.

Nəhayət, mövzuları və serializmə qarşı kifayət qədər qorunma əlavə etdik, amma kodumuz çətin və çirkin görünür. Qəhrəmanımıza bir yazı verək

 public final class Foo implements Serializable { private static final long serialVersionUID = 1L; // Wrapped in a inner static class so that loaded only when required private static class FooLoader { // And no more fear of threads private static final Foo INSTANCE = new Foo(); } // TODO add private shouting construcor public static Foo getInstance() { return FooLoader.INSTANCE; } // Damn you serialization @SuppressWarnings("unused") private Foo readResolve() { return FooLoader.INSTANCE; } } 

Bəli, bu bizim çox qəhrəman :)
Xəttin private static final Foo INSTANCE = new Foo(); yalnız FooLoader sinfi həqiqətən istifadə edildikdə yerinə FooLoader , bir tənbəl instansiya,

və aşağı axın təhlükəsizliyi təmin olunacaq.

Və bu günə qədər biz var, burada etdiyimiz hər şeyə nail olmaq üçün ən yaxşı yoldur, ən yaxşı şəkildə mümkündür.

  public enum Foo { INSTANCE; } 

Nə daxili olaraq qəbul ediləcək

 public class Foo { // It will be our sole hero private static final Foo INSTANCE = new Foo(); } 

Bu, seriallaşma qorxusu deyil, strings və ya malformasiya kodu. Bundan əlavə, ENUMS singleton lazily başlanğıc edilmişdir .

Bu yanaşma, ictimai olaraq əldə edilən sahə yanaşmasına funksional olaraq bərabərdir, istisna olmaqla, sərbəst serializasiya aparatlarını təmin edir və kompleks serializasiya və ya əks etdirmənin qarşısında olsa da, bir çox təyiniatlara qarşı bir zəmanət təmin edir. Bu yanaşma hələ qəbul edilməməsinə baxmayaraq, təkli sayım tipi bir təklüyü tətbiq etmək üçün ən yaxşı yoldur.

-Joshua Bloch "Effektiv Java"

İndi niyə ENUMS Singleton və səbr üçün təşəkkür üçün ən yaxşı yolu hesab olunur bilər
Blogumda yeniləndi.

127
16 мая '13 в 9:24 2013-05-16 09:24 cavab 16 may 2013-cü il saat 9: 00-da xyz verilir

Stu Thompson tərəfindən təqdim edilən həll Java5.0 və daha sonra etibarlıdır. Amma istifadə etməməyi xahiş edirəm, çünki mən səhv meylli olduğunu düşünürəm.

Dəyişən bəyanatı unutmaq asandır və bunun nəyə görə lazım olduğunu başa düşmək çətindir. Uçuşsuzluq olmadan, bu kod artıq ikiqat kilid nəzarəti səbəbindən zəmanətsiz olacaq. Bununla əlaqədar daha ətraflı məlumat üçün praktikada Java Eşzamanlamasının 16.2.4-cü bəndinə baxın. Qısaca: bu şablon (Java5.0 ya da uçucu bir operator olmadan) bir Bar obyektinə istinad edir (hələ də) yanlış vəziyyətdədir.

Bu şablon performansı optimallaşdırmaq üçün icad edilmişdir. Amma əslində bu artıq bir problem deyil. Aşağıdakı tənbəl başlatma kodu sürətli və daha da önemlisi, oxumaq daha asandır.

 class Bar { private static class BarHolder { public static Bar bar = new Bar(); } public static Bar getBar() { return BarHolder.bar; } } 
121
16 сент. Benno Richters tərəfindən verilmiş cavab 16 sentyabr 2008-09-16 15:24 '08 at 15:24 2008-09-16 15:24

Java 5 + tavanın qorunması:

 class Foo { private static volatile Bar bar = null; public static Bar getBar() { if (bar == null) { synchronized(Foo.class) { if (bar == null) bar = new Bar(); } } return bar; } } 

EDIT . volatile diqqət yetirin :) Bu vacibdir, çünki, digər məsələlər JMM (Java yaddaş modeli) tərəfindən dəyərinin dəyişməsini görmək üçün təmin edilmir. Sinxronizasiya bununla maraqlanmır - yalnız bu kod blokuna giriş serializes.

EDIT 2 : @ Bill Puh (FindBugs) tərəfindən tövsiyə olunan yanaşmanın detallarına cavab verməyin və bu daha yaxşı ola bilər. Cavabınız üçün oxuyun və səs verin.

94
16 сент. Cavab 16 sentyabrda Stu Thompson tərəfindən verilir. 2008-09-16 12:51 '08 at 12:51 2008-09-16 12:51

Tələsik başlanğıcını unutma, bu çox problemlidir. Bu ən sadə həlldir:

 public class A { private static final A INSTANCE = new A(); private A() {} public static A getInstance() { return INSTANCE; } } 
90
16 сент. 16 Sentyabrda Jonathan'a cavab verildi. 2008-09-16 12:49 '08 at 12:49 2008-09-16 12:49

Gerçəkliyinizə əmin olun. Bununla yanaşı bəzi "ardıcıl" dəlilləri görmək üçün "tək nümunədir". Göründüyü kimi, bununla yanlış bir şey yoxdur, ancaq bir qlobal qaynaq / məlumatın paylaşılması üçün bir mexanizmdir, buna görə də bu ən yaxşı üsuldur. Xüsusilə, birbaşa testlərdən istifadə edərkən, xüsusən də, test məqsədləri üçün istehza edilmiş resurslardan istifadə etməyə icazə verdiyindən, asılılıq mübadiləsini daha faydalı tapdım.

47
16 сент. Neil Burroughs'un 16 Sentyabrda verdiyi cavabı 2008-09-16 12:33 '08 at 12:33 2008-09-16 12:33

Unutmayın ki, Singleton yüklənmiş sinif yükləyicisi üçün yalnız Singletondur. Birdən çox yükləyici (konteyner) istifadə etsəniz, onların hər biri Singleton öz versiyasına sahib olmalıdır.

26
16 сент. Cavamann tərəfindən 16 sentyabrda verilən cavabı 2008-09-16 21:12 '08 at 9:12 pm 2008-09-16 21:12

Dİ singletons istifadə alternativ təklif edir ki, bəzi cavabları ilə təəccüb edirəm; bunlar əlaqədar anlayışlar deyil. Tək rejimli və ya qeyri-vahid (məsələn, axınlar) nümunələri daxil etmək üçün DI istifadə edə bilərsiniz. Ən azından bu doğru, əgər 2.x istifadə edirsinizsə, digər DI çərçivələri üçün danışa bilmirəm.

Beləliklə, OP-yə cavab verəcəyəm (ən çətin nümunə kodundan başqa):

  • Daha sonra Bahar kimi bir DI infrastrukturundan istifadə edin
  • Bağımlılıklarınızın tek noktadan olub olmadığı, kapsam, seans kapsamı və ya başqa bir şey isteyip istemediğinizi, DI yapılandırmanızın bir parçası olun.

Bu yanaşma, siz təklüyü istifadə etməyinizdən asılı olmayaraq, asanlıqla geri qaytarılacaq bir tətbiq təfərrüatıdır (istifadə etdiyiniz hər hansı bir təkamaxanın təhlükəsizdirsə, əlbəttə ki, təkamüllü (və buna görə də çevik və doğrulanabilir) ).

21
16 сент. Cavab 16 sentyabrda Andrew Swan tərəfindən verilir . 2008-09-16 15:06 '08 at 3:06 pm 2008-09-16 15:06

Yazmaqdan əvvəl bir nikahın niyə ehtiyac duyduğunu düşünün. Onların istifadəsi ilə bağlı yaranan dini müzakirələr var və siz Java-da onlayn google onlayn istifadə etdiyiniz təqdirdə asanlıqla bədbəxt ola bilərsiniz.

Şəxsən, bir çox səbəblərdən mümkün qədər tez-tez singletons qarşısını almaq üçün çalışırıq və onların əksəriyyəti bir axtarış mühərriki ilə bir yerdə tapa bilərsiniz. Mən çoxdan təkli olduğumuzu düşünürəm, çünki hər kəs tərəfindən anlamaq asandır, onlar OO dizaynında "qlobal" məlumat əldə etmək üçün bir mexanizm kimi istifadə olunur və onlar bir obyektin həyat dövrü idarəçiliyini (ya da B içərisindən A kimi edə bilərsiniz. Yaxşı bir orta hesabla İdarə Tersi (IoC) və ya Enjeksiyon Bağlılığı (DI) kimi şeylərə baxın.

Əgər həqiqətən birinizə ehtiyacınız varsa, Vikipediya bir tək kodun düzgün tətbiqi üçün yaxşı bir nümunədir.

20
16 сент. Cavab 16 saylı Aidos tərəfindən verilir . 2008-09-16 12:48 '08 at 12:48 2008-09-16 12:48

Aşağıda 3 müxtəlif yanaşma var.

1) Enum

  public enum EasySingleton{ INSTANCE; } 

2) ikiqat yoxlama Engellenmə / tənbəl yükləmə

  public class DoubleCheckedLockingSingleton{ private static volatile DoubleCheckedLockingSingleton INSTANCE; private DoubleCheckedLockingSingleton(){} public static DoubleCheckedLockingSingleton getInstance(){ if(INSTANCE == null){ synchronized(DoubleCheckedLockingSingleton.class){ //double checking Singleton instance if(INSTANCE == null){ INSTANCE = new DoubleCheckedLockingSingleton(); } } } return INSTANCE; } } 

3) Statik zavod metodu

  public class Singleton{ //initailzed during class loading private static final Singleton INSTANCE = new Singleton(); //to prevent creating another instance of Singleton private Singleton(){} public static Singleton getSingleton(){ return INSTANCE; } } 
16
17 февр. Abhijit Gaikwad tərəfindən 17 Fevralda cavab verildi . 2013-02-17 06:46 '13 saat 06:46 'da 2013-02-17 06:46

Mənim bacımları idarə etmək üçün Bahar Çərçivəsində istifadə edirəm. Bu, bir neçə sinif yükləyiciləri iştirak edərsə, hər hansı bir şeyi edə bilməyəcək "tək-tək" sinifini istifadə etmir, lakin fərqli obyektlər yaratmaq üçün müxtəlif fabrikləri yaratmaq və fərdiləşdirmək üçün çox sadə bir yol təqdim edir.

13
22 сент. Cavab Matt 22 sentyabrda verilir 2008-09-22 23:44 '08 at 11:44 pm 2008-09-22 23:44

Versiya 1:

 public class MySingleton { private static MySingleton instance = null; private MySingleton() {} public static synchronized MySingleton getInstance() { if(instance == null) { instance = new MySingleton(); } return instance; } } 

Lazy yükləmə, bloklama ilə iş parçalanma təhlükəsizliyi, synchronized nəticəsində pis performans.

Versiya 2:

 public class MySingleton { private MySingleton() {} private static class MySingletonHolder { public final static MySingleton instance = new MySingleton(); } public static MySingleton getInstance() { return MySingletonHolder.instance; } } 

Lazy yükləmə, zəmanətsiz, təhlükəsiz, yüksək performanslı.

11
01 апр. cavab coderz 01 apr verilir . 2015-04-01 14:14 '14 'da 14:14' de, 2015-04-01 14:14

Lazımlı bir yükləmə lazım deyilsə, yalnız cəhd edin

 public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return Singleton.INSTANCE; } protected Object clone() { throw new CloneNotSupportedException(); } } 

Bir tənbəl yükləməlisinizsə və Singleton-nun ipliklə təhlükəsiz olmasını istəyirsinizsə, ikiqat çek nişanını sınayın.

 public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if(null == instance) { synchronized(Singleton.class) { if(null == instance) { instance = new Singleton(); } } } return instance; } protected Object clone() { throw new CloneNotSupportedException(); } } 

Ikiqat çek nümunəsi işləmək üçün zəmanət verilmədiyindən (bəzi kompilyator problemi üzündən bu barədə bir şey bilmirəm), bütün getInstance metodunu sinxronizasiya etməyə və ya bütün singletonlarınız üçün bir qeyd yaratmağa cəhd edə bilərsiniz.

10
16 сент. Aleksi Yrttiaho tərəfindən verilmiş cavab 16 Sep. 2008-09-16 12:50 '08 at 12:50 pm 2008-09-16 12:50

Vikipediyada tək-tək nümunələr var. Java 5-nin tətbiqi olduqca tam görünə bilər və iplik təhlükəsizdir (cüt blok məhdudlaşdırma istifadə olunur).

10
16 сент. cavab verildi macbirdie 16 Sep. 2008-09-16 12:35 '08 at 12:35 2008-09-16 12:35

Enum singleton deyərdim

Java ilə enum istifadə Singleton adətən enum singleton elan bir yoludur. Enum singleton bir nümunə dəyişən və bir nümunə metodu ola bilər. Sadəlik üçün də, bu metodun axınının təhlükəsizliyini təmin etmək üçün lazım olan bir nümunə metodundan istifadə etməyinizə diqqət yetirin ki, əgər bu obyektin vəziyyətinə təsir etsə.

Bir nüsxədən istifadə etmək çox sadədir və serializable obyektlərə münasibətdə başqa yollarla əvəz edilməli olan qüsurları yoxdur.

  public enum Singleton { INSTANCE; public void execute (String arg) { //perform operation here } } 

Singleton.INSTANCE dan, Singleton.INSTANCE getInstance() çox daha asandır.

1.12 Numaralama sabitlərinin seriyalaşdırılması

Continuum sabitləri müntəzəm serializable və ya xarici obyektlərdən fərqli olaraq serialized olunur. Bir enum sabidin seriyalı forması yalnız onun adından ibarətdir; Sabit sahə dəyərləri şəklində yoxdur. Bir numaralandırma sabitini ObjectOutputStream , ObjectOutputStream sabit adı metodu enum tarafından döndürülen ObjectOutputStream yazar. Bir enum sabitini sərbəstləşdirmək üçün ObjectInputStream xaricdən daimi adı oxuyur; Sonra seriyalı sabit, java.> metoduna zəng etməklə əldə edilir, nəticədə daimi adla birlikdə java.> daimi növündəki argumentlərdən keçir. Digər serializable və ya xarici obyektlər kimi, numaralandırma sabitləri sonradan serializasiya akışında görünən geri yükləmə üçün hədəflər kimi fəaliyyət göstərə bilər.

writeObject sabitləri olan serialized olan proses konfiqurasiya edilə bilməz: hər hansı bir writeObject , readObject , readObjectNoData , writeReplacereadResolve sinif üsulları, enum növləri ilə müəyyən edilir, serialization və serialization zamanı serialization və serialization zamanı serialPersistentFields və serialVersionUID hər hansı bir sahə bildirişləri də bütün növlər üçün nəzərə alınmır. Numaralandırmalarda serialVersionUID sabit serialVersionUID var. Serializable sahələri və siyahıyaalma növləri üzrə məlumatların sənədləşdirilməsinə ehtiyac yoxdur, çünki göndərilən məlumatların tipində heç bir dəyişiklik yoxdur.

Oracle sənədlərindən istinad edilmişdir

Normal müntəzəm bir problem isə, Serializable interfeysinin tətbiqindən sonra, artıq Singleton qalmayıb, çünki readObject() metodu həmişə Java-da konstruktor tipinin yeni bir nümunəsini qaytarır. Bu, readResolve() istifadə edərək və yeni yaradılan nümunəni atmaqla, onu aşağıda göstərildiyi kimi, bir singletonla əvəz etməkdən qaçınmaq olar

  // readResolve to prevent another instance of Singleton private Object readResolve(){ return INSTANCE; } 

Singleton sinifinin keçid verməsi lazım olduğuna baxmayaraq, bu daha mürəkkəb ola bilər, amma Enum Singleton ilə Serialization JVM tərəfindən təmin edilir.


Yaxşı oxumaq

8
17 янв. Cavab verilir NullPoiiteya 17 yanvar. 2013-01-17 08:31 '13 saat 08:31 'da 2013-01-17 08:31
 There are 4 ways to create a singleton in java. 1- eager initialization singleton public class Test{ private static final Test test = new Test(); private Test(){} public static Test getTest(){ return test; } } 2- lazy initialization singleton (thread safe) public class Test { private static volatile Test test; private Test(){} public static Test getTest() { if(test == null) { synchronized(Test.class) { if(test == null){test = new Test(); } } } return test; } 3- Bill Pugh Singleton with Holder Pattern (Preferably the best one) public class Test { private Test(){} private static class TestHolder{ private static final Test test = new Test(); } public static Test getInstance(){ return TestHolder.test; } } 4- enum singleton public enum MySingleton { INSTANCE; private MySingleton() { System.out.println("Here"); } } 
6
23 авг. Dheeraj Sachan tərəfindən verilmiş cavab 23 avqust. 2016-08-23 13:25 '16 saat 13:25 'da 2016-08-23 13:25

Bəlkə bu məsələ ilə oyunla bir az gecikir, amma Singletonun tətbiqində bir çox nüanslar var. Şəkil sahibi bir çox hallarda istifadə oluna bilməz. Və uçucu istifadə edərkən IMO - bir yerli dəyişən də istifadə etməlisiniz. Mənə başla və problemi təkrar edək. Mən nə demək istədiyimi anlayacaqsınız.