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

Ինչպե՞ս կարող եմ սկզբնավորել փոխկապակցված վերջնական հղումները:

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

class Base{
    public Base run(){
        return null;
    }   
    static Base factory(final Base n){
        return new Base(){
            public Base run(){
                return n;
            }
        };
    }
}

public class CircularReferences{
    public static void main(String args[]){
        final Base a, b;
        a = Base.factory(b);
        b = Base.factory(a);
    }
}

Ես ստանում եմ CircularReferences.java:17; error: variable b might not have been initialized: Դա ճիշտ է, այդպես չէր, բայց չե՞մ կարող ես տեղ հատկացնել այս փոփոխականների համար և այնուհետև նախաստորագրել դրանք՝ օգտագործելով հղումներ այս բացատներին, որոնք կլցվեն համապատասխան արժեքներով՝ նախքան դրանք իրականում օգտագործելը: Կարո՞ղ եմ օգտագործել new-ը կոնստրուկտորից առանձին: Ինչպե՞ս կարող եմ ստեղծել այս փոփոխականները, որպեսզի դրանք հղում կատարեն միմյանց:


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


1

Արագ պատասխանն այն է, որ դուք չեք կարող դա անել: Եթե ​​դուք անպայման պետք է նման բան անեք, ապա դասի վրա օգտագործեք մասնավոր կարգավորիչ և դրանք կառուցելուց հետո կապեք իրերը (այսինքն՝ վերջնական դաշտերի փոխարեն օգտագործեք պարտադրված անփոփոխություն): Հուսով եմ, որ ակնհայտ է, որ ես չեմ կարծում, որ սա լավ գաղափար է. ես պարզապես ուզում էի տալ ձեր իրական հարցի պատասխանը, նախքան պատասխանեմ այնպես, ինչպես ես իսկապես ուզում եմ:

Լավ, հիմա դա դուրս է եկել ճանապարհից, ահա իրական պատասխանը, որը կոչված է այստեղ.

Ընդհանուր առմամբ, նման իրավիճակն ուժեղ ցուցիչ է, որ մտահոգությունները տարանջատելու համար անհրաժեշտ է վերամշակում: Այլ կերպ ասած, Base դասը, հավանաբար, փորձում է պատասխանատու լինել չափազանց շատ բաների համար:

Ես հասկանում եմ, որ օրինակը հորինված է, բայց մտածեք, թե ինչ գործառույթ է պահանջում շրջանաձև կախվածություն, ապա դրեք այդ ֆունկցիոնալությունը առանձին դասի/օբյեկտի մեջ, որն այնուհետև փոխանցվում է Base-ի երկու կոնստրուկտորներին:

Բարդ ճարտարապետություններում շրջանաձև կախվածության շղթաները կարող են բավականին մեծանալ, բայց վերջնական դաշտերի խիստ պարտադրումը հիանալի միջոց է վերագործարկման այդ տեսակի հնարավորությունները փնտրելու համար:

Եթե ​​դուք ունեք կոնկրետ օրինակ, ես ուրախ կլինեմ օգնելու որոշ վերակառուցման առաջարկություններով, որոնք վերացնում են նման կախվածությունը:


բերված կոնկրետ օրինակ. ահա իմ առաջարկը.

Թվում է, թե մտահոգություն կա համապատասխան ParseStrategy-ի ձեռքբերման վերաբերյալ, որը հիմնված է նշանի վրա: ParseStrategy Մատակարար: Այսպիսով, կլինի TopLevelParseStrategy, որը կարդում է հաջորդ նշանը, որոնում է համապատասխան վերլուծության ռազմավարությունը և կատարում այն:

TopLevelParseStrategy-ը վերջնական հղում կունենա ParseStrategyProvider-ին:

Այնուհետև ParseStrategyProvider-ը պետք է ունենա գրանցման մեթոդ (այսինքն՝ registerStrategy (token, parseStrategy)):

Սա ֆունկցիոնալ առումով շատ չի տարբերվում մասնավոր կարգավորիչի միջոցով պարտադրված անփոփոխելիությամբ դա անելուց (registStrategy մեթոդը բոլոր նպատակներով և նպատակներով նույնն է, ինչ մասնավոր կարգավորիչը), բայց դիզայնը շատ ավելի ընդարձակելի է:

Այսպիսով, դուք կունենաք.

public ParseStrategy createParser(){
  ParseStrategyProvider provider = ParseStrategyProvider.create();
  TopLevelParseStrategy topLevel = new TopLevelParseStrategy(provider);
  provider.registerStrategy("(", topLevel);

  // create and register all of your other parse strategies

  return topLevel;
}
03.10.2015
  • Ամբողջական ծրագրում Base-ը Parser դաս է, run-ը վերլուծական մեթոդ է, որը վերցնում է String և Position, և գործարանը ներկայացնում է անալիզատորների մի շարք, ինչպիսին sepBy-ն է, և ցանկացածը, որը ստեղծում է նոր վերլուծիչներ գոյություն ունեցողներից: Բայց փակագծերի ներսում արտահայտությունները պետք է նորից վերլուծվեն վերին մակարդակի վերլուծիչով, ինչի պատճառով կա շրջանաձև կախվածություն: Ես պետք է ավելացնե՞մ այդ կոդը իմ հարցին: 03.10.2015
  • Նոր նյութեր

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

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

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

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

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

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

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