AMcoder - javascript, python, java, html, php, sql

Մասնավոր դասը որպես վերադարձի տեսակ հանրային մեթոդից

Ինչու է սա վավեր:

Foo.java

public class Foo {

    public Bar getBar() {
        return new Bar();
    }

    private class Bar {}

}

Եթե ​​Bar-ը մասնավոր է, ինչպե՞ս կօգտագործեն այս դասի օգտատերերը այս մեթոդը: Պոլիմորֆիզմը, իհարկե, կարող է օգտագործվել, բայց չէ՞ որ սա պետք է անվավեր լինի, և հայտարարությունը պետք է նշի որպես օբյեկտ վերադարձնող:


Պատասխանները:


1

Ես պարզապես մի քիչ ուսումնասիրել եմ այս մասին և չեմ կարողացել վերջնական պատասխան գտնել: Ամենայն հավանականությամբ, դա պարզապես անտեսում է Java լեզվի դիզայներների կողմից, և քանի որ այն իրականում որևէ վնաս չի պատճառում, այն մնացել է: Այն իրականում չի տարբերվում public մեթոդը private դասի մեջ դնելուց: Ոչինչ չի խանգարում ձեզ դա անել, թեև այդ public մեթոդն իրականում մուտք գործելու հնարավորություն չկա:

Իհարկե, NetBeans-ը ձեզ նախազգուշացնում է «Ոչ հրապարակային տիպի արտահանում հանրային API-ի միջոցով», երբ փորձում եք դա անել: Ես ակնկալում եմ, որ այլ միջավայրերի մեծ մասը նման նախազգուշացում կտա:

Վերադարձված օբյեկտը բոլորովին անիմաստ է բոլորի համար, ովքեր փորձում են օգտագործել այն (եթե նրանք օգտագործում են արտացոլումը), գրեթե այն ամենը, ինչ նրանք կարող են անել, այն պահելն է Object-ում (կամ ցանկացած այլ սուպեր դասի, որին նրանք հասանելի են) և այնուհետև փոխանցել այդ Objectը: շուրջը։

Դուք կարող եք պոտենցիալ ցանկանալ դա անել, եթե անցած Objectն օգտագործվի որպես «բռնակ», որը փոխանցվում է, բայց երբեք չի վիրահատվում: Այդ դեպքում, թեև շատ ավելի խելամիտ կլիներ ունենալ public դասը, բայց դրա մեջ եղած բոլոր մեթոդները դարձնել private՝ կանխելու դրանց վրա գործելու ձեր դասից դուրս (կամ սահմանեք public ինտերֆեյս, որպեսզի վերադառնա, և private դասը դա իրականացնի):

Այսպիսով, պատասխանը կարծես թե հետևյալն է.

Հավանաբար, այն չպետք է վավեր լինի, բայց քանի որ դա ոչ մի վնաս չի պատճառում, այն երբեք չի արգելափակվել:

Նմանատիպ թեմայի վերաբերյալ այստեղ լավ պատասխան կա.

Ոչ հրապարակային տիպի արտահանում հանրային API-ի միջոցով

16.12.2013
  • Մի բան այն մասին, թե ինչ եք ասում մասնավոր դասում հանրային մեթոդներ ստեղծելու մասին: Դա իսկապես տարբերություն է, եթե դուք ունեք այդ private class-ի օբյեկտ ծնող դասի ներսում, դուք չեք կարող զանգահարել մասնավոր մեթոդ, այնպես չէ՞: Այսպիսով, մասնավոր/հանրային մեթոդները մասնավոր դասերում օգտակար են դասի հասանելիություն ունեցող շրջանակների օգտագործումը սահմանելու համար: 17.12.2013
  • Իրականում դուք կարող եք. Ներքին դասերը համարվում են ծնող դասի անդամ՝ մասնավոր մեթոդներին և փոփոխականներին մուտք գործելու համար (ինչպես ներքինից դեպի արտաքին, այնպես էլ արտաքինից դեպի ներքին): 17.12.2013
  • Դա իրականում կարևոր է: Այն թույլ է տալիս ստեղծել ներքին դասեր մասնավոր մեթոդներով և մուտք գործել դրանք արտաքին դասից՝ առանց այդ դասից դուրս դրանք բացահայտելու: 17.12.2013
  • Իրականում չափազանց տարածված և օգտակար է մասնավոր դասերը վերադարձնել պատշաճ ձևավորված Java կոդով, քանի դեռ դասերն իրականացնում են որոշակի ինտերֆեյս: Java գրադարանները դա անում են անընդհատ: Թեև նրանք հավանաբար կվերադարձնեն ինտերֆեյսի տեսակը, ի տարբերություն մասնավոր դասի տեսակի: 21.12.2013
  • Հենց այդպես. Վերադարձի տեսակը ինտերֆեյսն է, ոչ թե այն իրականացնող մասնավոր դասը: մասնավոր դասի վերադարձը շատ իմաստալից է: Մասնավոր դասի վերադարձի տեսակ ունենալը չի ​​նշանակում: 21.12.2013
  • Դա իմաստ ունի, երբ դուք ցանկանում եք զանգահարել մեթոդը մի շրջանակից, որն ունի մասնավոր դասի մուտք, ինչպես օրինակ Foo-ի ներսում: 23.01.2018
  • @JensSchauder Ապա ձեր մեթոդը պետք է լինի մասնավոր: Հանրային մեթոդով վերադարձ/ընդունել մասնավոր դասը միշտ էլ վատ դիզայն է: Մեթոդը պետք է լինի մասնավոր, դասը պետք է լինի հանրային, կամ մեթոդը պետք է վերադարձնի ինտերֆեյս, իսկ դասը պետք է իրականացնի այդ ինտերֆեյսը: Ոչինչ չի խանգարի, որ ձեր հիպոթետիկ ներքևի ծածկագիրը մասնավոր դասի օրինակում փոխանցվի այն մեթոդին, որն ակնկալում է միջերես: 23.01.2018
  • Այդ դեպքում ձեր մեթոդը պետք է լինի մասնավոր, ինչու: Եթե ​​ինձ պետք է արդյունքը (որպես հանրամատչելի ինտերֆեյս կամ սուպեր դաս արտաքին շրջանակում), մեթոդը հանրայնացնելը ճիշտ է անել: 23.01.2018
  • @JensSchauder Եթե Ձեզ անհրաժեշտ է արդյունքը, ապա արդյունքը չի կարող մասնավոր լինել: Մասնավոր դասի վերադարձը շատ քիչ է տարբերվում Object վերադարձից: 23.01.2018
  • @JensSchauder Դրանում ամեն ինչ սխալ է: Եթե ​​այն պարունակում է բովանդակալից տվյալներ, դուք չեք կարող մուտք գործել դրանք: Եթե ​​դա բռնակ է, ապա չկա կոմպիլյացիայի ժամանակի տեսակի անվտանգության ստուգում դրա օգտագործման վերաբերյալ: Դա բացարձակապես անիմաստ է, և ես մի փոքր շփոթված եմ, թե ինչու եք նույնիսկ այլ կերպ մտածել: Ո՞րն է դրա համար ձեր օգտակար օգտագործման դեպքը: 23.01.2018
  • Եկեք այս քննարկումը շարունակենք զրուցարանում: 23.01.2018

  • 2

    Ինչու է սա վավեր:

    Քանի որ հաճախորդի կոդը զանգի վայրում կարող է ակնկալել Object (կամ ընդհանրապես ոչինչ չակնկալել), այս մեթոդը որևէ տեղից զանգահարելու խնդիր չկա.

    Object o = new Foo().getBar();
    
    16.12.2013

    3

    Այն վավեր է, քանի որ Bar-ը տեսանելի է Foo դասին: Այսպիսով այն կազմում է.

    Իհարկե, մեկ այլ դաս չի կարող տեսնել Bar-ը և, հետևաբար, չի կարող օգտագործել վերադարձի արժեքը:

    Բայց մեկ այլ դաս դեռ կարող է պարզապես կանչել մեթոդը՝ առանց վերադարձի արժեքի օգտագործման:

    public class FooBar {
    
       public void invokeBar() {
            Foo foo = new Foo();
            foo.getBar();
       }
    }
    
    16.12.2013
  • @JqueryLearner ok Ես թարմացրի, որպեսզի չշփոթեմ ուրիշներին: Անվանատարածքով ես պարզապես նկատի ունեմ, որ անվան մեջ բացատը վավեր է: Ինչպե՞ս եք այն անվանում: 16.12.2013
  • Ես նաև աշխատել եմ c#-ի վրա, ուստի գիտեմ, թե ինչ է նշանակում անվանատարածք c#-ում 16.12.2013
  • @JqueryLearner Ես վստահ եմ, որ դուք գիտեք դա: Ես պարզապես հարցրեցի, թե գիտե՞ք, թե ինչպես է այն սովորաբար կոչվում java-ում: Կարծում էի, որ անվանատարածքը նույնպես լավ կլինի Java-ի համար: 16.12.2013

  • 4

    Մասնավոր դաս վերադարձնող հանրային մեթոդը կարող է օգտակար լինել, քանի որ դուք պետք է կարողանաք մեթոդը կանչել ցանկացած շրջանակից (օրինակ՝ մուտացիայի ենթարկել Foo-ի ներքին վիճակը) և ներքին օգտագործման համար, եթե ձեզ անհրաժեշտ է որևէ արդյունք, ի լրումն պարզապես զանգելու: մեթոդը։

    16.12.2013

    5
    public class Foo {
    
        private String myString;
    
        public String getMyString() {
            return myString;
        }
    
    }
    

    Սա նույնպես վավեր է։ Ինչու՞ պետք է ներքին դասերը այլ կերպ վարվեն:

    Bar private դարձնելը միայն այն դարձնում է անտեսանելի արտաքին աշխարհի համար, ինչպես դաշտերը private պատրաստելը:

    Կարևոր նախազգուշացումներից մեկն այն է, որ նույնիսկ եթե դուք կարողանաք զանգահարել getBar() Foo օբյեկտի վրա, դուք չեք կարող զանգահարել այդ հղումի մեթոդները (տեսանելիության պատճառով):

    Այսպիսով, գլխավորն այն է, որ դուք կարող եք դա անել, բայց չպետք է դա անել:

    Միակ իրավիճակը, որը ես կարող եմ պատկերացնել, այն է, երբ Foo-ը նույնպես ներքին դաս է, իսկ Foo-ի արտաքին դասը ցանկանում է օգտագործել Bar-ը:

    16.12.2013
  • Ես դեմ եմ քվեարկել: Դուք հարցին չէիք պատասխանել այն ժամանակ, երբ ես պատասխանեցի: 16.12.2013
  • Դուք հարցին չէիք պատասխանել այն ժամանակ, երբ ես պատասխանեցի: Դուք լո՞ւրջ եք: 16.12.2013
  • @Adam Aroid լավ բացատրություն: Ես չգիտեմ, թե ինչու է ինչ-որ մեկը դեմ քվեարկել ??? Ես կողմ եմ քվեարկել, քանի որ ինձ դուր է գալիս ձեր պատասխանը: 16.12.2013
  • Միգուցե ես այն շատ արագ կարդացի, քանի որ չեմ հիշում, որ տեսել եմ վերջին տողը, որը միակ բիթն է, որն իրականում ուղղակիորեն պատասխանել է հարցին: Կներեք դրա համար, վերընթերցելուց հետո ես հեռացրեցի դեմ քվեարկությունը :) 16.12.2013
  • Ես խմբագրեցի իմ պատասխանը, երբ դուք կարդում էիք բնօրինակը, կարծում եմ: 16.12.2013
  • Այն դեռ իրականում չի պատասխանում այն ​​հարցին, թե ինչու է օգտակար վերադարձնել արտաքին աշխարհի համար անտեսանելի օբյեկտի բարը: Ինչո՞ւ կարող եք երբևէ ցանկանալ դա անել և ինչո՞ւ կարող է օգտակար լինել դա անել: 16.12.2013
  • Հարցը վերաբերում է բնադրված տիպի տեսանելիությանը: Ոչ փոփոխականների մասին: 16.12.2013
  • Ես նշեցի փոփոխականները, քանի որ դա կարող է հեշտացնել տիպի տեսանելիության պատճառները: 16.12.2013

  • 6

    Ներքին դասարան

    Ներքին դասերը ներկայացնում են հարաբերությունների հատուկ տեսակ, որն այն է, որ այն կարող է մուտք գործել արտաքին դասի բոլոր անդամներին (տվյալների անդամներ և մեթոդներ), ներառյալ մասնավորը: Ներդրված դասերը կարող են հանգեցնել ավելի ընթեռնելի և պահպանվող կոդի, քանի որ այն տրամաբանորեն խմբավորում է դասերը միայն մեկ տեղում:

    16.12.2013

    7

    Բնադրված տեսակների ձևերից է։ Այս տեսակի դասի հռչակագիրը հայտնի է որպես ներքին դաս: Եթե ​​դուք հայտարարում եք ներքին դասը որպես ստատիկ, ապա այն հայտնի կդառնա որպես վերին մակարդակի nested class: Java-ում առկա ներդիր տիպերի այլ ձևեր են տեղական դասը; դասը հայտարարված և սահմանված է բլոկի ներսում, այսինքն՝ մեթոդի կամ կոնստրուկտորի կամ սկզբնավորիչի բլոկի մեջ: Բնադրված տիպի չորրորդ ձևը անանուն դասն է; դաս առանց որևէ անվան, որի օբյեկտն օգտագործվում է այնտեղ, որտեղ սահմանված է դասը:

    Ինչ վերաբերում է ձեր գործին, այսինքն՝ ներքին դասին, դասի բոլոր դասերը կարող են հայտարարվել հանրային, մասնավոր և պաշտպանված մուտքի ցուցիչներով: Բոլոր դասերը, որոնց հետ կցվում է դասը, ինչպես նաև ինքնին կցվող դասը կիսում են վստահության հարաբերությունները: Դա նշանակում է, որ ներքին դասի բոլոր մասնավոր անդամները, ինչպես նաև կից դասի մասնավոր անդամները կիսվում են միմյանց միջև: Այնուամենայնիվ, դուք չեք կարող մուտք գործել ներքին դասի օբյեկտ առանց պարփակող դասի օբյեկտի:

    Երբ դուք կփորձեք ստեղծել ներքին դասի օբյեկտ, կոմպիլյատորը կզեկուցի կոմպիլյացիայի ժամանակի սխալ: Այնուամենայնիվ, հետևյալ օրինակը մուտք գործեք միմյանց դասի մասնավոր անդամներին, այսինքն՝ փակելով ներքին դասի մասնավոր անդամներին և ներքաշող դասի մասնավոր անդամներին.

    class Bar {
        private static int x;
    
        public void getFoo() {
            System.out.println(new Foo().y);
        }
    
        private class Foo {
            private int y;
            public void getBar() {
                System.out.println(Bar.x);
            }
        }
    }
    
    public class Test{
        public static void main(String[] a) {
            Bar b = new Bar();
            //Bar.Foo f = new Bar.Foo(); This is completely illegal syntax.     
        }
    }
    

    Լավագույն օրինակը, որը դուք կարող եք ունենալ ներքին դասի համար, Accounts դասի հարաբերությունն է, որը կցում է դասը և Transaction դասը, որը ներքին դաս է: Մեկ Accounts դասը կարող է ունենալ մեկից ավելի Transaction օբյեկտ, սակայն Transaction օբյեկտը չի կարող գոյություն ունենալ առանց Accounts օբյեկտի:

    Թեև մասնավոր ներքին դասի օբյեկտը վերադարձնելն անօգուտ է, քանի որ այն դառնում է անտեսանելի իր դասից դուրս: Ինչպես բացատրում է Accounts և Transaction դասի վերը նշված օրինակը: Transaction-ը չի կարող գոյություն ունենալ առանց Accounts օբյեկտի:

    16.12.2013

    8

    Ես դրա համար ունեմ միանգամայն վավեր օգտագործման դեպք, և ես ուրախ եմ, որ դա թույլատրված է:

    Եկեք մնանք, դուք ունեք դաս, որը ստեղծում է UI-ի կտորներ: Այն ընդունում է ինչ-որ տիրույթի օբյեկտ և ստեղծում է UI-ի մի հատված.

    public Node createPersonUI(Person person) {
        BasePanel panel = new BasePanel();
        // ... setup panel with values ...
        return panel;
    }
    

    BasePanelNode-ի ենթադաս է և որոշ ներքին դաս է, որի հետ զանգահարողը գործ չունի, քանի որ այս դասը որոշում է, թե ինչ տեսք կունենան իրերը:

    Այժմ, ես գտա, որ պետք է նորից օգտագործեմ այս դասի մի մասը, երբ պետք է աջակցեի նոր օբյեկտ, PersonalProfile, որը պարունակում է շատ ավելի շատ տեղեկատվություն, բայց նաև պարունակում է հիմնական Person տվյալները.

    public Node createPersonalProfileUI(PersonalProfile profile) {
        BasePanel panel = new BasePanel();
        // ... setup panel with values ...
        return panel;
    }
    

    Այնուամենայնիվ, այդ կոդը մասամբ կրկնօրինակված էր, ուստի ես արեցի.

    public Node createPersonalProfileUI(PersonalProfile profile) {
        BasePanel panel = (BasePanel)createPerson(profile.getPerson());
        // ... only setup missing values ...
        return panel;
    }
    

    Դերասանական կազմը, սակայն, մի փոքր ծիծաղելի է. այն փոխելով BasePanel վերադարձնելու համար ոչ միայն աշխատում է, այլև չի բացահայտում իմ մասնավոր դասի որևէ գործառույթ: Փոխարենը, այն բացահայտում է միայն այն մեթոդները հանրային դասերից, որոնք նա ժառանգել է... փայլուն:

    Ամբողջական կոդը.

    public BasePanel createPersonUI(Person person) {
        BasePanel panel = new BasePanel();
        // ... setup panel with values ...
        return panel;
    }
    
    public BasePanel createPersonalProfileUI(PersonalProfile profile) {
        BasePanel panel = createPerson(profile.getPerson());
        // ... only setup missing values ...
        return panel;
    }
    
    private class BasePanel extends Node {
    }
    
    17.08.2018
  • Կարծում եմ, որ այդ դեպքում ավելի ճիշտ կլինի ունենալ երրորդ մասնավոր մեթոդ, որը ներառում է այդ ֆունկցիոնալությունը: Հիմնականում այն, ինչ createPersonUI-ն արդեն անում է, և թող createPersonUI-ն պարզապես զանգի այս նոր մասնավոր մեթոդը: Կարծում եմ, որ քանի որ, օրինակ, այս դասի համար փաստաթղթեր ստեղծելիս, մեթոդի վերադարձի տեսակը կլինի BasePanel-ը, և փաստաթղթերի սպառողը կարող է մուտք չունենա իմանալու, թե ինչ է BasePanel-ը կամ այն ​​նույնիսկ ընդլայնում է Node-ը, քանի որ այն մասնավոր. Բայց լավ, բոլոր նման սցենարներում, եթե գործիքները տեղյակ լինեն այս մասին և փոխարենը ցույց տան Node-ը, այնքան էլ վատ չի լինի: 18.08.2018
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..