Արագ պատասխանն այն է, որ դուք չեք կարող դա անել: Եթե դուք անպայման պետք է նման բան անեք, ապա դասի վրա օգտագործեք մասնավոր կարգավորիչ և դրանք կառուցելուց հետո կապեք իրերը (այսինքն՝ վերջնական դաշտերի փոխարեն օգտագործեք պարտադրված անփոփոխություն): Հուսով եմ, որ ակնհայտ է, որ ես չեմ կարծում, որ սա լավ գաղափար է. ես պարզապես ուզում էի տալ ձեր իրական հարցի պատասխանը, նախքան պատասխանեմ այնպես, ինչպես ես իսկապես ուզում եմ:
Լավ, հիմա դա դուրս է եկել ճանապարհից, ահա իրական պատասխանը, որը կոչված է այստեղ.
Ընդհանուր առմամբ, նման իրավիճակն ուժեղ ցուցիչ է, որ մտահոգությունները տարանջատելու համար անհրաժեշտ է վերամշակում: Այլ կերպ ասած, 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