বস্তুর মধ্যে কোনও পার্থক্য নেই; HashMap<String, Object>উভয় ক্ষেত্রেই আপনার একটি রয়েছে। আপনার বস্তুটির ইন্টারফেসের মধ্যে একটি পার্থক্য রয়েছে । প্রথম ক্ষেত্রে, ইন্টারফেসটি HashMap<String, Object>অন্যদিকে এটির ক্ষেত্রে Map<String, Object>। তবে অন্তর্নিহিত বস্তুটি একই।
ব্যবহারের সুবিধা Map<String, Object>হ'ল আপনি অন্তর্নিহিত অবজেক্টটিকে যে কোনও কোড ব্যবহার করছেন না সেটিকে আপনার চুক্তি ভঙ্গ না করে ভিন্ন ধরণের মানচিত্র হিসাবে পরিবর্তন করতে পারেন। আপনি যদি এটি হিসাবে ঘোষণা করেন HashMap<String, Object>তবে অন্তর্নিহিত বাস্তবায়নটি পরিবর্তন করতে চাইলে আপনাকে আপনার চুক্তিটি পরিবর্তন করতে হবে।
উদাহরণ: ধরা যাক আমি এই ক্লাসটি লিখি:
class Foo {
private HashMap<String, Object> things;
private HashMap<String, Object> moreThings;
protected HashMap<String, Object> getThings() {
return this.things;
}
protected HashMap<String, Object> getMoreThings() {
return this.moreThings;
}
public Foo() {
this.things = new HashMap<String, Object>();
this.moreThings = new HashMap<String, Object>();
}
// ...more...
}
শ্রেণিতে স্ট্রিং-> অবজেক্টের কয়েকটি অভ্যন্তরীণ মানচিত্র রয়েছে যা এটি সাবক্লাসের সাথে (অ্যাক্সেসর পদ্ধতির মাধ্যমে) ভাগ করে দেয়। আসুন আমি HashMapশুরু করে এস দিয়ে লিখি বলে আমি মনে করি কারণ ক্লাসটি লেখার সময় এটি উপযুক্ত কাঠামোটিই ব্যবহার করা উচিত।
পরে, মেরি কোড এটি সাবক্লাসিংয়ে লেখেন। উভয়ের সাথে তার কিছু করার দরকার ছিল thingsএবং moreThingsতাই স্বাভাবিকভাবেই সে এটিকে একটি সাধারণ পদ্ধতিতে রাখে এবং তার পদ্ধতিটি সংজ্ঞায়িত করার সময় getThings/ আমি একই ধরণের ব্যবহার করি getMoreThings:
class SpecialFoo extends Foo {
private void doSomething(HashMap<String, Object> t) {
// ...
}
public void whatever() {
this.doSomething(this.getThings());
this.doSomething(this.getMoreThings());
}
// ...more...
}
পরে আমি সিদ্ধান্ত নেন যে আসলে, এটা ভাল যদি আমি ব্যবহার করেন TreeMapপরিবর্তে HashMapমধ্যে Foo। আমি আপডেট Fooপরিবর্তন HashMapকরতে TreeMap। এখন, SpecialFooআর সংকলন করবেন না, কারণ আমি চুক্তিটি ভঙ্গ করেছি: Fooবলত এটি সরবরাহ করে HashMapতবে এখন TreeMapsপরিবর্তে এটি সরবরাহ করে। সুতরাং আমাদের SpecialFooএখনই ঠিক করতে হবে (এবং এই ধরণের জিনিসটি একটি কোডবেসের মাধ্যমে ছড়িয়ে দিতে পারে)।
আমার বাস্তবায়নটি ব্যবহার করার HashMap(এবং তা ঘটে) ভাগ করে নেওয়ার সত্যিকারের সঠিক কারণ না থাকলে আমার কী করা উচিত ছিল তা ঘোষণা করা হয়েছিল getThingsএবং getMoreThingsকেবল Map<String, Object>তার চেয়ে বেশি নির্দিষ্ট না হয়ে ফিরে আসা ছিল। আসলে, অন্য কিছু করার জন্য একটি ভাল কারণ ব্যতীত, এমনকি Fooআমার মধ্যেও সম্ভবত ঘোষণা করা উচিত thingsএবং / moreThingsহিসাবে Mapনয় :HashMapTreeMap
class Foo {
private Map<String, Object> things; // <== Changed
private Map<String, Object> moreThings; // <== Changed
protected Map<String, Object> getThings() { // <== Changed
return this.things;
}
protected Map<String, Object> getMoreThings() { // <== Changed
return this.moreThings;
}
public Foo() {
this.things = new HashMap<String, Object>();
this.moreThings = new HashMap<String, Object>();
}
// ...more...
}
আমি এখন Map<String, Object>যেখানেই পারছি সর্বত্র কীভাবে ব্যবহার করছি তা নোট করুন , কেবলমাত্র যখন আমি আসল অবজেক্ট তৈরি করি তখনই সুনির্দিষ্ট।
আমি যদি তা করে থাকি তবে মেরি এটি করতেন:
class SpecialFoo extends Foo {
private void doSomething(Map<String, Object> t) { // <== Changed
// ...
}
public void whatever() {
this.doSomething(this.getThings());
this.doSomething(this.getMoreThings());
}
}
... এবং পরিবর্তনগুলি সংকলন বন্ধ Fooকরত না SpecialFoo।
ইন্টারফেসগুলি (এবং বেস ক্লাস) আমাদের যথাযথ পরিবর্তনগুলি করার জন্য প্রচ্ছদের অধীনে আমাদের নমনীয়তাটি রেখে প্রয়োজনীয় হিসাবে কেবল ততটাই প্রকাশ করি । সাধারণভাবে, আমরা আমাদের উল্লেখগুলি যথাসম্ভব মৌলিক হতে চাই। আমাদের যদি এটি জানতে না হয় তবে HashMapএটিকে একটি বলুন Map।
এটি কোনও অন্ধ নিয়ম নয়, তবে সাধারণভাবে, সবচেয়ে সাধারণ ইন্টারফেসে কোডিং আরও নির্দিষ্ট কিছুতে কোডিংয়ের চেয়ে কম ভঙ্গুর হতে চলেছে। যদি আমি যে মনে চাই, আমি একটি নির্মিত হতো না Fooযে, মরিয়মের সেট আপ দিয়ে ব্যর্থতার জন্য SpecialFoo। মেরি যদি এটি মনে রাখে, তবে আমি গণ্ডগোল করলেও Fooতিনি তার Mapপরিবর্তে তার ব্যক্তিগত পদ্ধতি ঘোষণা করতেন HashMapএবং আমার পরিবর্তিত Fooচুক্তি তার কোডটির উপর প্রভাব ফেলবে না।
কখনও কখনও আপনি এটি করতে পারবেন না, কখনও কখনও আপনাকে নির্দিষ্ট হতে হবে। তবে আপনার যদি না হওয়ার কোনও কারণ না থাকে তবে সর্বনিম্ন-নির্দিষ্ট ইন্টারফেসের দিকে ভুল করুন।