আমি দেখতে পেলাম সবচেয়ে অপরিবর্তনীয় POJO গুলি:
public class MyObject {
private final String foo;
private final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
public String getFoo() {
return foo;
}
public int getBar() {
return bar;
}
}
তবুও আমি তাদের এইভাবে লিখতে চাই:
public class MyObject {
public final String foo;
public final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
}
উল্লেখ্য উল্লেখগুলি চূড়ান্ত, সুতরাং অবজেক্টটি এখনও অপরিবর্তনীয়। এটি আমাকে কম কোড লিখতে দেয় এবং সংক্ষিপ্ততর (5 টি অক্ষর দ্বারা: get
এবং ()
) অ্যাক্সেসের অনুমতি দেয়।
আমি দেখতে পাচ্ছি একমাত্র অসুবিধা হ'ল আপনি যদি রাগের কিছু getFoo()
করার জন্য রাস্তাটি বাস্তবায়ন পরিবর্তন করতে চান তবে আপনি পারবেন না। কিন্তু বাস্তবে, এটি কখনই ঘটে না কারণ অবজেক্টটি অপরিবর্তনীয়; আপনি ইনস্ট্যান্টেশন চলাকালীন যাচাই করতে পারেন, তাত্ক্ষণিক সময়ে অপরিবর্তনীয় ডিফেন্সিভ কপি তৈরি করতে পারেন ( ImmutableList
উদাহরণস্বরূপ পেয়ারা দেখুন ) এবং কলটির জন্য foo
বা bar
বস্তু প্রস্তুত পেতে পারেন get
।
আমি কি কোন অসুবিধা মিস করছি?
সম্পাদনা
আমি মনে করি যে অন্য একটি অসুবিধা আমি হারিয়ে যাচ্ছি সেটি হ'ল সিরিয়ালাইজেশন লাইব্রেরিগুলি দিয়ে শুরু হওয়া পদ্ধতিগুলির প্রতিচ্ছবি get
বা তার ব্যবহার শুরু করে is
তবে এটি একটি দুর্দান্ত ভয়ঙ্কর অনুশীলন ...
String
, int
অথবা MyObject
। প্রথম সংস্করণে final
কেবল ক্লাসের মধ্যে নির্মাণকারী ছাড়া অন্য পদ্ধতিগুলি চেষ্টা না করে তা bar = 7;
নিশ্চিত করা example দ্বিতীয় সংস্করণে, final
কাজ করা থেকে ভোক্তাদের প্রতিরোধ প্রয়োজনীয়: MyObject x = new MyObject("hi", 5); x.bar = 7;
।
Object
এখনও অপরিবর্তনীয় " "বিভ্রান্তিকর - এমনভাবে মনে হয় যে আপনি মনে করেন যে কোনও final Object
পরিবর্তনযোগ্য, যা তা নয়। ভুল জন্য দুঃখিত.
myObj.getFoo().setFrob(...)
।
final
কোনও পরিবর্তনশীল অবজেক্টটিকে পরিবর্তনযোগ্য করে তোলে না। আমিfinal
কলব্যাক তৈরির আগে আমি ক্ষেত্রগুলি সংজ্ঞায়িত করে এমন একটি নকশা ব্যবহার করি যাতে কলব্যাক সেই ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারে। এটি অবশ্যই কোনওsetX
পদ্ধতি সহ সমস্ত পদ্ধতি কল করতে পারে ।