গিটারস এবং সেটটার থাকা নিজেরাই এনক্যাপসুলেশনটি ভেঙে দেয় না। বিরতি এনক্যাপসুলেশন কী তা কোনও চিন্তাভাবনা না করে স্বয়ংক্রিয়ভাবে প্রতিটি ডেটা সদস্যের (প্রতিটি ক্ষেত্র , জাভা লিঙ্গো) জন্য একটি গিটার এবং একটি সেটার যুক্ত করছে । যদিও এটি সমস্ত ডেটা সদস্যকে পাবলিক করার চেয়ে ভাল, এটি কেবলমাত্র একটি ছোট পদক্ষেপের দূরে।
এনক্যাপসুলেশনের মূল বিষয়টি এই নয় যে আপনি কোনও জিনিসটির বাইরে থেকে অবজেক্টের অবস্থা জানতে বা পরিবর্তন করতে সক্ষম হবেন না, তবে এটি করার জন্য আপনার যুক্তিসঙ্গত নীতি থাকা উচিত ।
কিছু ডেটা সদস্য পুরোপুরি অবজেক্টের অভ্যন্তরীণ হতে পারে এবং এতে গেটর বা সেটটার নাও থাকতে পারে।
কিছু ডেটা সদস্যদের কেবল পঠনযোগ্য হওয়া উচিত, সুতরাং সেটারগুলির দরকার নেই তবে সেটারের দরকার নেই।
কিছু ডেটা সদস্যকে একে অপরের সাথে সামঞ্জস্য রাখতে হতে পারে। এই জাতীয় ক্ষেত্রে আপনি প্রত্যেকের জন্য একটি সেটার সরবরাহ করবেন না, তবে একই সময়ে সেগুলি সেট করার জন্য একটি একক পদ্ধতি, যাতে আপনি ধারাবাহিকতার জন্য মানগুলি পরীক্ষা করতে পারেন।
কিছু ডেটা সদস্যকে কেবলমাত্র নির্দিষ্ট উপায়ে পরিবর্তন করা দরকার যেমন নির্দিষ্ট পরিমাণ দ্বারা বর্ধিত বা হ্রাস করা। এই ক্ষেত্রে, আপনি একটি সেটারের পরিবর্তে একটি increment()
এবং / অথবা decrement()
পদ্ধতি সরবরাহ করবেন।
তবুও অন্যদের আসলে পড়ার-লেখার দরকার হতে পারে এবং এতে একটি গেটর এবং সেটার উভয়ই থাকতে পারে।
একটি উদাহরণ বিবেচনা করুন class Person
। ধরা যাক যে কোনও ব্যক্তির একটি নাম, একটি সামাজিক সুরক্ষা নম্বর এবং একটি বয়স রয়েছে। আসুন আমরা বলি যে আমরা লোকদের নাম বা সামাজিক সুরক্ষা নম্বরগুলি কখনও পাল্টাতে দিই না। তবে ব্যক্তির বয়স প্রতি বছর 1 বাড়াতে হবে। এই ক্ষেত্রে, আপনি এমন একটি কনস্ট্রাক্টর সরবরাহ করবেন যা প্রদত্ত মানগুলিতে নাম এবং এসএসএন সূচনা করবে এবং যা বয়সটি 0-এ শুরু করবে আপনি একটি পদ্ধতিও সরবরাহ করবেন incrementAge()
, যা বয়স বাড়িয়ে দেবে ১. আপনিও সরবরাহ করবেন তিনটি জন্য getters। এক্ষেত্রে কোনও সেটটারের প্রয়োজন নেই।
এই নকশায় আপনি শ্রেণীর বাইরে থেকে অবজেক্টের অবস্থা পরিদর্শন করার অনুমতি দিন এবং আপনি এটি শ্রেণীর বাইরে থেকে পরিবর্তন করার অনুমতি দিন। তবে, আপনি ইচ্ছামত রাজ্য পরিবর্তন করার অনুমতি দিচ্ছেন না। একটি নীতি রয়েছে, যা কার্যকরভাবে জানিয়েছে যে নাম এবং এসএসএন মোটেও পরিবর্তন করা যাবে না এবং বয়স একবারে 1 বছর বাড়ানো যেতে পারে।
এখন বলা যাক যে একজন ব্যক্তির বেতনও রয়েছে। এবং লোকেরা ইচ্ছামতো চাকরি পরিবর্তন করতে পারে যার অর্থ তাদের বেতনও পরিবর্তন হবে। এই পরিস্থিতিটির মডেল করার জন্য আমাদের কাছে কোনও setSalary()
পদ্ধতি সরবরাহ করা ছাড়া উপায় নেই ! ইচ্ছায় বেতন পরিবর্তন করার অনুমতি দেওয়া এক্ষেত্রে পুরোপুরি যুক্তিসঙ্গত নীতি।
উপায় দ্বারা, আপনার উদাহরণে, আমি বর্গ দিতে হবে এবং পদ্ধতি, পরিবর্তে এবং । তারপর আপনি এখনও encapsulation থাকতে হবে।Fridge
putCheese()
takeCheese()
get_cheese()
set_cheese()
public class Fridge {
private List objects;
private Date warranty;
/** How the warranty is stored internally is a detail. */
public Fridge( Date warranty ) {
// The Fridge can set its internal warranty, but it is not re-exposed.
setWarranty( warranty );
}
/** Doesn't expose how the fridge knows it is empty. */
public boolean isEmpty() {
return getObjects().isEmpty();
}
/** When the fridge has no more room... */
public boolean isFull() {
}
/** Answers whether the given object will fit. */
public boolean canStore( Object o ) {
boolean result = false;
// Clients may not ask how much room remains in the fridge.
if( o instanceof PhysicalObject ) {
PhysicalObject po = (PhysicalObject)o;
// How the fridge determines its remaining usable volume is a detail.
// How a physical object determines whether it fits within a specified
// volume is also a detail.
result = po.isEnclosedBy( getUsableVolume() );
}
return result;
}
/** Doesn't expose how the fridge knows its warranty has expired. */
public boolean isPastWarranty() {
return getWarranty().before( new Date() );
}
/** Doesn't expose how objects are stored in the fridge. */
public synchronized void store( Object o ) {
validateExpiration( o );
// Can the object fit?
if( canStore( o ) ) {
getObjects().add( o );
}
else {
throw FridgeFullException( o );
}
}
/** Doesn't expose how objects are removed from the fridge. */
public synchronized void remove( Object o ) {
if( !getObjects().contains( o ) ) {
throw new ObjectNotFoundException( o );
}
getObjects().remove( o );
validateExpiration( o );
}
/** Lazily initialized list, an implementation detail. */
private synchronized List getObjects() {
if( this.list == null ) { this.list = new List(); }
return this.list;
}
/** How object expiration is determined is also a detail. */
private void validateExpiration( Object o ) {
// Objects can answer whether they have gone past a given
// expiration date. How each object "knows" it has expired
// is a detail. The Fridge might use a scanner and
// items might have embedded RFID chips. It's a detail hidden
// by proper encapsulation.
if( o implements Expires && ((Expires)o).expiresBefore( today ) ) {
throw new ExpiredObjectException( o );
}
}
/** This creates a copy of the warranty for immutability purposes. */
private void setWarranty( Date warranty ) {
assert warranty != null;
this.warranty = new Date( warranty.getTime() )
}
}
Getters and setters are often criticized as being not proper OO
- অনুগ্রহপূর্বক