Java-де статикалық дананы пайдалану ақылға қонымды ба?

Мен бұл сұраққа жауап таба алмадым, сондықтан осында.

Бағдарламаның қалған бөлігі объектіге сілтеме жасай алатындай, Тұрақты нысанды пайдалану дұрыс емес пе? Мен өз сұрағымды қалай түсіндіру керектігін білмеймін, сондықтан жай ғана мысал кодын көрсетемін.

public class Client {

    Frame f;
    private static Client mainClient;

    public static void main(String[] args){
        new Client().init();
    }

    private void init(){

        mainClient = this;
        f = new Frame();

    }

    public static Client getClient() {
        return mainClient;
    }

    public Frame getFrame(){
        return f;
    }   
}

Сондықтан, Frame нысанына қатынау үшін, бағдарлама бойынша getClient() әдісін қолдана аламын ба? Мен оны жасайтын объектілердің (көпшілігінің) параметрі ретінде жіберуге қарсы емес пе? Frame бағдарлама бойы пайдаланылады және оны параметр ретінде қосу әр конструкторға бір параметр қосады.

Рахмет

4
@ Jtvd78 Қысқа жауап: бұл өте қолайлы. Егер сіз жіптерді пайдаланып жатсаңыз, жіп қауіпсіздігін қадағалаңыз.
қосылды автор emesx, көзі
Айта кету керек, «статикалық даналар» сияқты ештеңе жоқ. Статикалық айнымалы мәндері бар , бірақ нысан объективті статикалық емес немесе жоқ.
қосылды автор Jon Skeet, көзі
Түсіндіру үшін, Клиенттің тек бір данасы бар, ол кадрдың тек бір данасын жасайды. Және бұл бүкіл бағдарлама бойынша. Секция қауіпсіздігіне келетін болсақ, біреу неліктен бұл қауіпсіз емес деп түсіндіре алады? Сондай-ақ, сіз бұл деректер үлгісін бөлісудің жақсы баламасы болатынын айттыңыз. Мен бұл опция ретінде қарастырамын
қосылды автор Jtvd78, көзі
Сұрау: 1) осы қосымшаның өмір бойы әрдайым бір Frame болады ма, 2) бағдарламаның барлық бөліктері шын мәнінде бүкіл Frame-ге қол жеткізу керек пе, және 3) деректер үлгісі ортақ пайдалану керек пе, Frame емес,.
қосылды автор Andy Thomas, көзі

8 жауаптар

Бірнеше нәрсеге байланысты ...

1) Пайдалану . MyClass.getClient() деп айтуға және Клиент айнымалы сілтемесіне ие болғыңыз келе ме? Егер сіз синглтонның бір түріне ұмтылсаңыз - иә. Егер сіз өте ыңғайлы нәрсеге ұмтылсаңыз - иә, егер қауіпсіз болсаңыз, онда оны барлық жерде көргіңіз келсе - жоқ. Егер дұрыс емес орынға/уақытқа кірсеңіз, апаттар мен қателер пайда болады - жоқ.

2) Адамдар Адамдар сіз көрсеткеніңізді, кезеңді қолданатын болады. Клиентті өзіңіздің кодты алып жатқанын көріп отырса, олар да орынсыз болған кезде пайдаланылады, сондықтан көптеген қателер тудырады ма? :)

3) Дизайн Сізге шынымен қажет пе? Кез-келген уақытта абсолютті қолжетімділікке қарағанда, оны дәлел ретінде дәлірек тазалау керек пе?

Оларды бағалағаннан кейін сіз шешесіз. Бұл жақсы салынған және жақсы жұмыс істейтін сияқты. Бірақ мұндай шектелмеген қол жеткізуді қажет ететін кез келген нәрсе (жоғарыда аталған кез келген уақытта қол жетімділік) жұмыс уақытының ерекшеліктеріне жақсы көзқарас болмауы мүмкін; үй тапсырмалары үшін жұмыс істейтіндер кәсіпорынның бағдарламалық жасақтамасына арналған болмауы мүмкін.

6
қосылды
+1: үй тапсырмалары үшін жұмыс істейтін кәсіпорын бағдарламалары үшін бұл таза алтын.
қосылды автор Luiggi Mendoza, көзі

Синглтон үлгіні пайдалануыңыз дұрыс екенін түсіну үшін, «Бұл құрамдас бөлік қолданыс мерзімі ішінде бірдей болып қалады ма?» Деген сұраққа жауап беру керек, егер солай болса, онда оны сыныпта оқшаулау жақсы болар еді.

1
қосылды

Сіз сипаттайтындарыңыз singleton үлгісі деп аталады. Кейбір сыншылар бар болса да, бұл жиі қолданылатын үлгі болып табылады.

Нысаныңызды әрбір конструкторға берудің екінші баламасы тәуелділікті инъекциялау болады. Java үшін ең жақсы таңдау бірі Көктем .

1
қосылды
Көктемге балама ретінде мен guice ұсынар едім
қосылды автор mariosangiorgio, көзі
@Mariosangiorgio Java EE 5+ ортасында Spring және Guice-ге балама ретінде балама ретінде EJB 3 және/немесе CDI пайдалануды ұсынамын.
қосылды автор Luiggi Mendoza, көзі

Сіз тек SingleTon Pattern нұсқасын жасадыңыз. Тұрақты нысан сіздің жобаңызда сол нысанның тек бір данасын қажет ететін кезде пайдаланылады.

Синглтонның негізгі құрылымы

public class Client {
    private static Client mainClient;


    private void Client (){
        //do initial tasks
    }

    public static Client getClient() {
        if(mainClient == null)
            mainClient = new Client();
        return mainClient;
    }

    public Frame getFrame(){
        return f;
    }   
}

Сондықтан сіз кадрды пайдалана аласыз

Client.getClient().getFrame();
0
қосылды
Егер ол дәл бір дананы немесе ыңғайлылықты қаласа, онда бұл нәрсе ....
қосылды автор Shark, көзі

Тұрақты дананы пайдалану тұрақты/өзгермейтін нысандар үшін өте жақсы.

Ауыстырылатын объектілерге келетін болсақ, ол байланысты. Қарапайым бағдарламаларда бір жіп бар, ол жақсы жұмыс істейді. Дегенмен, егер ол мульти-түйін немесе кластерленген болса, синглтонды абайлап немесе мүлдем қолдануға болмайды.

0
қосылды

It is ok to do that. It would be helpful for you to read about singleton pattern

0
қосылды
«ОК» біраздан асып кетеді. Көптеген жағдайларда Singleton бұл күндері анти-паттерн деп санайды. Адамдар көбінесе және қай жерде болмасын қолдануға тиіс екенін білмейді және бәрін синглонға айналдырады. : Р
қосылды автор cHao, көзі

Әрине, бұл синглтон үлгілерін енгізу ең жек көретінім. Жақсы, оны кодтау өте оңай, бірақ кейінірек егер бірдеңе өзгертілсе, оны миллиондаған орындарда өзгерту керек. Singleton factory үлгісімен Тәуелділікті инъекция - инверсия басқармасы үлгісін қолданып, static айнымалы мәндерін тек тұрақты (мысалы, Strings, Integers ...).

Сіздің сұрағыңызға қатысты барлығы қолайлы. Іске асыру сіздің жобаңыздың талаптарына байланысты.

0
қосылды
@ Андре корпоративті бағдарламалық жасақтама үшін жұмыс істейтін болса, үй тапсырмалары үшін емес, керісінше.
қосылды автор Shark, көзі
@Andre: бұл дұрыс сөз - сен. Кейбір жағдайларда мұғалім/ТК, басқа да жағдайларда - қатаң нұсқаулықтармен және басқарушыға ешқашан кодекспен әсер етпеген басқарманың кодын сатып алған мұқият емес клиент ... Барлық жағдай дұрыс жағдайда және контекстен : D
қосылды автор Shark, көзі
@ Андре: Ия, әр құрылым мен тұжырымдама кейбір контекстте кейбір қолданысқа ие. Егер олай болмаса, ол болмас еді. Үлкен мәселе - белгілі бір тұжырымдаманың қандай контекстте пайдалы екенін білу.
қосылды автор cHao, көзі
«барлығы қолайлы» ???
қосылды автор André Stannek, көзі
Кейбір пайдалану - бұл қолайлы дегенді білдірмейді. Мен контекстке байланысты екеніне келісемін, бірақ мен бағдарламаны ешқашан қолайлы деп санамайтын көптеген нәрселер бар.
қосылды автор André Stannek, көзі

Негізінен сұранысыңыз синглтон үлгісін пайдаланудың жақсы екендігін сұрайды. Әрине, бұл. Бірақ мәселе GUI емес GUI элементтерін жасамайтыныңызға көз жеткізіңіз. Frame класына кіруге мүмкіндік беріп, ықтимал теріс пайдалану үшін ашасыз. Менің ойымша, сіз жалғыз бағдарламашысыз, сондықтан оны қалай ұстасаңыз сақ болыңыз.

0
қосылды