Sobes.tech
Junior — Middle

Կարո՞ղ է փոփոխականը, որը հայտարարված է effectively final-ով, փոխել օբյեկտի ներսում։

sobes.tech AI

Պատասխան AI-ից

Java-յում, "effectively final" տերմինը նշանակում է, որ փոփոխականը փոփոխված չէ՝ այն initialization-ից հետո, չնայած այն բացահայտորեն հայտարարված չէ final բանալի բառով: Սա կարևոր է, օրինակ, այդպիսի փոփոխականների օգտագործման համար lambda արտահայտություններում կամ անանուն դասարաններում:

Եթե փոփոխականը հայտարարված է որպես effectively final, ապա նրա արժեքը փոխել հնարավոր չէ — նոր արժեք նշանակելու փորձը կբերի կոդի սխալի:

Այնուամենայնիվ, եթե այդ փոփոխականը հղում է անում օբյեկտի, ապա այդ օբյեկտի վիճակը կարող է փոխվել, քանի որ փոխվում է ոչ թե հղումը, այլ օբյեկտի ներքին դաշտերը: Օրինակ՝

final List<String> list = new ArrayList<>();
list.add("նոր տարր");  // Սա թույլատրվում է

// list = new ArrayList<>();  // Սխալ, հղումը փոխել չի կարելի

Այսպիսով, փոփոխականի արժեքը (հղումը) փոխել հնարավոր չէ, բայց այն օբյեկտի պարունակությունը, որի վրա հղում է, կարող է փոխվել։