গেটার/সেটার মেথড এর ব্যবহার কখন কোথায় করতে হবে আর এই মেথড ব্যবহারের সুবিধা কি এই বিষয়ে ভাল কোন টিপস পাচ্ছি না।

asked 07 May '17, 04:47

Aziz's gravatar image

Aziz
1436

edited 07 May '17, 04:48


Constructor এর কাজ কি ?

মনে করেন আপনি একটা Circle এর অবজেক্ট বানাবেন . এই সার্কেল অবজেক্ট বানানোর সময় ডিফল্ট ভাবে এর কি কি বৈশিষ্ট্য থাকবে সেটা আপনি Constructor এর মধ্যে বলে দেন এই ভাবে ।

private int radius = 0;
private String color = "";

Circle(int radius, String color) {
    this.radius = radius;
    this.color = color;
}

যখন আপনার Circle এর কোন অবজেক্ট ক্রিয়েট করার দরকার হয় তখন আপনি এইভাবে করেন,

Circle c = new Circle(10, "Red");

এখন আপনি চাচ্ছেন আপনি যে c নামে Circle অবজেক্ট ক্রিয়েট করেছেন সেটার color পরিবর্তন করে red থেকে green করতে চান । এই কাজটা আপনি কিভাবে করবেন ?

আপনার color নামে যে attribute আছে সেটা যদি public দিয়ে ডিক্লেয়ার করা থাকে তবে c.color = "green" করে দিলেই সেটার ভালু পরিবর্তন হয়ে যাবে । কিন্তু সেটা যদি private ভাবে ডিক্লেয়ার করা থাকে তবে আপনি সেটা c.color = "green" দিয়ে পরিবর্তন করতে পারবেন না ।

কারণ আমারা জানি private কে তার ক্লাসের বাহির থেকে সরাসরি পরিবর্তন করা যায় না ।

এখন প্রশ্ন হল তাহলে আমরা সেটা কে কিভাবে অ্যাক্সেস করব ?

যেহেতু color সার্কেল ক্লাসের মধ্যে private তাই এটাকে এই ক্লাসের বাহির থেকে অ্যাক্সেস করা না গেলও এই ক্লাসর মধ্যে থেকে কিন্তু ঠিকই অ্যাক্সেস করা যাবে । এখন আমরা যদি এই সার্কেল ক্লাসের মধ্যে এমন একটি public মেথড বানায় সেটার প্যারামিটার হিসাবে আমরা একটা color স্ট্রিং পাঠাব সেই color কে circle এর নতুন color হিসাবে সেটা করে দিবে । Circle ক্লাসের মধ্যে মেথড টা দেখতে এই রকম হবে ।

public void setNewColor(String newColor) {
    this.color = newColor;
}

এই setNewColor() যেহেতু একটা public মেথড তাই এটাকে আমরা Circle ক্লাসের বাহির থেকেও অ্যাক্সেস করতে পারি । এখন আমাদের যদি color পরিবর্তন করার প্রয়োজন হয় তবে c.setNewColor("green") কল করলেই কিন্তু কাজ হয়ে যাচ্ছে । কারণ এই মেথডের মধ্যে আমার লিখেছি this.color = newColor; আর public মেথড হওয়ায় এটা কে আমরা যে কোন জায়গা থেকে কল করতে পারি :)

এই যে আমরা Cricle নামের ক্লাসের private ভারিয়েবল কে পরিবর্তন করার জন্য ওই ক্লাসের মধ্যে একটা public মেথড বানালাম সেই মেথডকেই বলা হয় Setter . নাম দেখেই বোঝা যাচ্ছে এটা কাজ হল সেট করা । এই Setter মেথডের অন্য একটা নাম আছে সেটা হলও mutator মেথড ।

তাহলে getter টা আসলে কি ?

মনে করেন আপনার যে color নামের private ভারিয়েবল আছে সেটা আপনি শুধু দেখতে চাচ্ছেন । এখন আপনি যদি Circle ক্লাসের বাহির থেকে c.color দিয়ে প্রিন্ট করেন তবে আপনি সেটা দেখতে পারবেন না । কারণ এটা একটা private ভারিয়েবল ।

কিন্তু আপনি যদি আগের মতো একটা public মেথড বানানো থেকে যেটা শুধু এই color রিটার্ন কবে । তাহলে কিন্তু আপনি আগের মতো করেই Circle ক্লাসের বাহির থেকে এটা রিড করতে পারবেন । মেথড টা এই রকম হতে পারে ।

public String getColor() {
    return this.color;
}

এখন আপনি c.getColor() দিলেই color পেয়ে যাবেন । এই মেথড কে বলা হচ্ছে setter এর অন্য আরেকটা নাম হল Accessor মেথড । এই কাজ টা কিন্তু c.color দিয়ে করতে পারবেন না ।

এখন প্রশ্ন করতে পারেন এত ঝামেলা করার কি দরকার ?

সবগুলো কে public করে declare করলেই তো হয় । তাহলে তো খুব সহজেই c.anyVariable দিয়ে সবগুলো কে অ্যাক্সেস করা যাবে ।

এতে সমস্যা আছে । মনে করেন আপনার Girl নামে একটা class আছে যার একটা property হল age . এখন আমরা সবাই জানি মেয়েরা তাদের বয়স public ভাবে জানাতে চায় না । এখন আপনি যদি age টা public করে দেন । তবে Girl কিন্তু আপনার অবস্থা খারাপ করে দিবে :P আবার নাও দিতে পারে যদি আপনার সাথে তার ইয়ে না থাকে ।

ধন্যবাদ :)

permanent link

answered 07 May '17, 17:33

menon's gravatar image

menon
4.7k334

edited 08 May '17, 07:49

1

হা হা। Girl কি ইচ্ছাকৃতভাবে Gril হয়ে গেল?

(08 May '17, 03:39) mahrahat
1

হা হা হা এইটা কোন বিষয় না। বিষয়টা অনেক সহজ করে বুঝানোর জন্য ধন্যবাদ। :)

(08 May '17, 05:43) Aziz
1

হা হা হা । এই বানান টার সাথে আমি অনেক দিন থেকে পরিচিত না । তাই লিখার সময় একটু সন্দেহ ছিল যে বানান টা আসলে ঠিক হচ্ছে কি না । তো এই জন্য আমি Gril লিখে গুগলে সার্চ দিলে । কেন জানিনা গুগল সার্চে কিছু Gril ও Girl এর ছবি চলে আসল । তাই আমি মনে করেছিলেম দুইটার বানান মনে হয় একই :D @mahraht, @Aziz

(08 May '17, 07:49) menon

এখন Gril থেকে Girl করে দিলাম :)

(08 May '17, 07:50) menon
1

@menon হুমম, তবে পুরো লেখাটা সুন্দর হয়েছে ভাই ☺

@Aziz ভাই, উত্তরটি পছন্দ হলে অ্যাক্সেপ্ট করতে পারেন ☺

(08 May '17, 17:49) mahrahat

ধন্যবাদ @mahrahat

(08 May '17, 17:51) menon
showing 5 of 6 show 1 more comments

আপনার এই প্রশ্নের উত্তর এই লিঙ্ক এ ভালোভাবে ব্যাখ্যা করা আছে।

permanent link

answered 07 May '17, 09:04

Hyper%20Remede's gravatar image

Hyper Remede
1534

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×210
×2
×2

question asked: 07 May '17, 04:47

question was seen: 815 times

last updated: 08 May '17, 17:51