চূড়ান্ত হওয়া অপরিবর্তনীয় হওয়ার মতো নয়।
final != immutable
final
শব্দ নিশ্চিত রেফারেন্স পরিবর্তিত না হয় করতে ব্যবহার করা হয় (যে, রেফারেন্স এটি একটি নতুন এক দ্বারা প্রতিস্থাপিত করা যাবে না)
তবে, বৈশিষ্ট্যটি যদি স্ব পরিবর্তনযোগ্য হয় তবে আপনি স্রেফ যা বর্ণনা করেছেন তা করা ঠিক হবে।
এই ক্ষেত্রে
class SomeHighLevelClass {
public final MutableObject someFinalObject = new MutableObject();
}
আমরা যদি এই ক্লাসটি ইনস্ট্যান্ট করি তবে আমরা চূড়ান্তsomeFinalObject
হওয়ায় বৈশিষ্ট্যের জন্য অন্য মান নির্ধারণ করতে পারব না ।
সুতরাং এটি সম্ভব নয়:
....
SomeHighLevelClass someObject = new SomeHighLevelClass();
MutableObject impostor = new MutableObject();
someObject.someFinal = impostor;
তবে যদি বস্তুটি এটি নিজেই পরিবর্তিত হয়:
class MutableObject {
private int n = 0;
public void incrementNumber() {
n++;
}
public String toString(){
return ""+n;
}
}
তারপরে, সেই পরিবর্তনীয় বস্তুর অন্তর্ভুক্ত মানটি পরিবর্তন করা যেতে পারে।
SomeHighLevelClass someObject = new SomeHighLevelClass();
someObject.someFinal.incrementNumber();
someObject.someFinal.incrementNumber();
someObject.someFinal.incrementNumber();
System.out.println( someObject.someFinal );
এটিতে আপনার পোস্টের একই প্রভাব রয়েছে:
public static void addProvider(ConfigurationProvider provider) {
INSTANCE.providers.add(provider);
}
এখানে আপনি ইনস্ট্যান্টের মান পরিবর্তন করছেন না, আপনি এর অভ্যন্তরীণ অবস্থাটি সংশোধন করছেন (মাধ্যমে, সরবরাহকারী.এডিডি পদ্ধতি)
আপনি যদি প্রতিরোধ করতে চান যে শ্রেণীর সংজ্ঞাটি এভাবে পরিবর্তন করা উচিত:
public final class ConfigurationService {
private static final ConfigurationService INSTANCE = new ConfigurationService();
private List providers;
private ConfigurationService() {
providers = new ArrayList();
}
....
তবে, এটি খুব বেশি অর্থবহ হতে পারে না :)
যাইহোক, আপনাকে একই কারণে অ্যাক্সেসটি সিঙ্ক্রোনাইজ করতে হবে ।