জাভা পদ্ধতিতে কল গ্রহণযোগ্য অনুশীলনে 'এটি' পাস করছে


93

একটি পদ্ধতি কলটিতে বর্তমান বস্তুটি পাস করা কি ভাল / খারাপ / গ্রহণযোগ্য অনুশীলন? হিসাবে:

public class Bar{
    public Bar(){}

    public void foo(Baz baz){
        //  modify some values of baz
    }
}

public class Baz{
    //constructor omitted

    public void method(){
        Bar bar = new Bar();
        bar.foo(this);
    }
}

বিশেষত, লাইনটি bar.foo(this)গ্রহণযোগ্য?


60
কেন তা গ্রহণযোগ্য হবে না? এটা সাধারণ.
সাগুরেট

4
সুতরাং ... এটি 8 হ্যাঁ এর :) (এবং হ্যাঁ, আমি এটি আপডেট করে রাখছি))
অ্যালেক্স গিটমিয়ার

4
অ স্থির বেনাম শ্রেণি স্বয়ংক্রিয়ভাবে সুপার বর্গের এই রেফারেন্সটি পাস করে, সুতরাং এটি গ্রহণযোগ্য হবে। একমাত্র সতর্কতা হবে বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স সম্পর্কে সতর্কতা অবলম্বন করা।
মেহুল রাঠোদ

5
যদিও এখানে একটি সাবধানতা অবলম্বন করা উচিত: আপনি এটি কনস্ট্রাক্টরে পাস করবেন না কারণ এটি আপনার বিষয়টিকে একটি বেমানান অবস্থায় প্রকাশ করবে। লোকেরা সাধারণত এটি করে যখন তারা কল্যাব্যাকগুলি তৈরি করে (যেমন অ্যাকশনলিস্টনার) বেনামে অভ্যন্তরীণ শ্রেণি হিসাবে এবং তারপরে এটিকে অন্য কোনও বস্তুতে দেয়।
তামাস রেভ

4
@ অডিস্ট্রয় যদিও আমি সম্মত তা গ্রহণযোগ্য, তবে বোঝা যাচ্ছে যে এটি গ্রহণযোগ্য কারণ এটি সাধারণ কারণ সত্যই খারাপ যুক্তি। কিছু করা কারণ এটির সাধারণ কারণ আপনাকে অনেক সমস্যায় ফেলতে পারে
কেরি কেন্ডাল

উত্তর:


155

এটি ব্যবহার না করার কোনও কারণ নেই, thisএটি বর্তমান উদাহরণ এবং এটি ব্যবহার করার পক্ষে এটি পুরোপুরি বৈধ। আসলে এটি বাদ দেওয়ার কোনও পরিষ্কার উপায় নেই।

সুতরাং এটি ব্যবহার করুন।

যেহেতু এটি উদাহরণস্বরূপ গ্রহণযোগ্য তা নিশ্চিত করা শক্ত (এই জাতীয় প্রশ্নের একটি নেতিবাচক উত্তর তর্ক করার পক্ষে সর্বদা সহজ), আমি সবেমাত্র একটি খুব সাধারণ java.langক্লাস খুলেছি , Stringএকটি এবং অবশ্যই আমি এই ব্যবহারের উদাহরণ খুঁজে পেয়েছি, উদাহরণস্বরূপ

1084        // Argument is a String
1085        if (cs.equals(this))
1086            return true;

সন্ধান (thisবড় "গৃহীত" প্রকল্পে, আপনি তা খুঁজে পেতে ব্যর্থ করা হবে না।


6
নিখুঁত উত্তর.
maxf130

15
-1 কারণ দ্বি-দিকনির্দেশক শ্রেণীর সম্পর্ক ইউনি-দিকনির্দেশক সম্পর্কের চেয়ে জটিল বলে উল্লেখ করা হয়নি। সফ্টওয়্যারটি যথাসম্ভব পরিষ্কার হওয়া নিশ্চিত করা অত্যাবশ্যক। উপরের নির্দিষ্ট উদাহরণে দুই শ্রেণীর মধ্যে দ্বি-দিকনির্দেশক রেফারেন্স এড়াতে এবং আচরণ এবং ডেটা একসাথে আনতে বাজ ক্লাসে মেথড ফুকে স্থানান্তরিত করা আরও বোধগম্য হবে ।
জেডাব্লু

36
-১ উত্তরের কারণ আপনি প্রশ্নে অতিরিক্ত একটি ছোটখাটো বিশদ পেয়েছেন যার উপর আপনি মন্তব্য করতে পারেন? সত্যি?
সাগুরেট অস্বীকার করেছে

13
@ অডিস্ট্রয় হ্যাঁ আমি আপনার উদ্বোধনের এই বাক্যটির সাথে একমত নই: "এটি ব্যবহার না করার কোনও কারণ নেই"।
জেডাব্লু

4
অনুশীলনে, বাস্তব কোডে (ওপির সরল উদাহরণের বিপরীতে) পাস করার thisঅর্থ এই নয় যে উদাহরণস্বরূপ উত্তরাধিকার এবং ইন্টারফেসের কারণে আপনি একটি দ্বি নির্দেশমূলক লিঙ্ক যুক্ত করবেন।
সাগ্রুরেট

165

এতে কোনও ভুল নেই। যা ভাল অভ্যাস নয় তা হ'ল একই অভ্যন্তর নির্মাণকারীদের করণীয়, কারণ আপনি কোনও-এখনও-সম্পূর্ণ-আরম্ভ করা অবজেক্টকে একটি রেফারেন্স দেবেন।

এখানে একই ধরণের পোস্ট রয়েছে: জাভা এটি নির্মাতায় ফাঁস করছে যেখানে তারা পরে কেন একটি খারাপ অভ্যাস তা ব্যাখ্যা দেয়।


18
+1: কনস্ট্রাক্টরগুলিতে 'এটি' উল্লেখ করে বিপত্তিটি উল্লেখ করা ভাল।
বাথশেবা

এটি অগত্যা খারাপ অভ্যাস নয়। উদাহরণস্বরূপ, কোনও Carকনস্ট্রাক্টর উদাহরণ তৈরি করতে পারে Wheel, একটি Carব্যতীত Wheelঅসম্পূর্ণভাবে আরম্ভ করা হবে, যখন একটি সম্পর্কিত Wheelছাড়াও Carঅসম্পূর্ণভাবে আরম্ভ করা হবে। এই ক্ষেত্রে, গাড়ির কন্সট্রাক্টরের পক্ষে হুইলটির কনস্ট্রাক্টরের কাছে যেতে পারা যায় this। অন্য বিকল্পটি হ'ল গাড়ি এবং চাকা উভয়েরই ব্যক্তিগত নির্মাতা রয়েছে এবং কারখানা চাকা তৈরি করে এবং কারটিতে চাকাটি ইনস্টল করে এমন একটি কারখানা ফাংশন ব্যবহার করা হবে; তবে এটি কি গাড়িতে স্থিতিশীল পদ্ধতি বা চক্রের স্থির পদ্ধতি হওয়া উচিত?
মিথ্যা রায়ান

স্পষ্টতই, আপনার এমন একটি তৈরি করা উচিত CarFactoryWheelInstallerProxyযা আপনার জন্য চাকাগুলি ইনস্টল করে।
কেভিন

6
@ লাইআরয়ান Wheelসম্পূর্ণরূপে অধস্তন Car, এবং আইএমও সম্পর্কে মোটেই জানা উচিত নয় Car
ইজকাটা

4
thisকনস্ট্রাক্টরের মধ্যে থেকে কেবলমাত্র ব্যবহার করার বিষয়টি হ'ল যদি thisএমন কোনও পদ্ধতি বা প্রসঙ্গে প্রেরণ করা হয় যা থেকে অবিশ্বস্ত বা অজানা ক্লায়েন্টদের (বা ক্লায়েন্ট কোড হিসাবে ধরে নেওয়া হয় যে এটির কোনও দৃষ্টিভঙ্গি রয়েছে) সম্পূর্ণরূপে নির্মিত বস্তু)। পাসিং thisএকটি কন্সট্রাকটর থেকে একটি প্যাকেজ-ব্যক্তিগত পদ্ধতি যা সঞ্চালিত একটি সাধারণ আরম্ভের আমার মতে, হয় না শুধুমাত্র গ্রহণযোগ্য কিন্তু কাঙ্ক্ষিত হয়।
স্কটব

42

হ্যাঁ , তবে আপনার দুটি বিষয়ে যত্নবান হওয়া উচিত

  1. এই পাস এখনো যখন বস্তুর নির্মাণ করা হয়েছে (যেমন তার কন্সট্রাকটর মধ্যে)
  2. এটি দীর্ঘস্থায়ী বস্তুর কাছে পৌঁছে দেওয়া, যা রেফারেন্সটি বাঁচিয়ে রাখবে এবং এই বস্তুকে আবর্জনা সংগ্রহ করা থেকে আটকাবে ।

4
নোট করুন যে জাভাতে কোনও কনস্ট্রাক্টর আসলেই নির্মাণকারী নয়, জাভার কনস্ট্রাক্টরকে "আরম্ভকারী" বলা ভাল। জাভা কনস্ট্রাক্টরের মধ্যে, অবজেক্টটি আসলে মেমরি বরাদ্দ করা হয়েছে, এটি বস্তুটি ইতিমধ্যে কনস্ট্রাক্টরের অভ্যন্তরে বিদ্যমান / নির্মিত হয়েছে।
মিথ্যা রায়ান

4
সত্যই নয়, অবজেক্টটিতে কিছু উদাহরণ ভেরিয়েবল থাকতে পারে যা এখনও শুরু করা হয়নি, যাতে অবজেক্টটি এখনও পুরোপুরি অপারেটিভ হয় না। সুতরাং, কন্সট্রাক্টরে আপনি এটি একটি দ্বিতীয় অবজেক্টে পাস করতে পারেন, এটি এমন কোনও পদ্ধতির অনুরোধ করতে পারে যেটি সেই অবজেক্টটিতে প্রবেশ করতে পারে যা তার সমস্ত দৃষ্টান্তের ভেরিয়েবলগুলি আরম্ভ করে না।
স্টিফানোস টি।

তবুও, যতক্ষণ না দ্বিতীয় অবজেক্টটি অবগত থাকবে যে পাস করা বস্তুটি আরম্ভ করা হয়নি, এবং এটিকে একটি অস্বচ্ছ বস্তু হিসাবে বিবেচনা করে, বা কেবল কল পদ্ধতি যা এইরকম অবস্থায় নিরাপদ হিসাবে ঘোষিত হয়েছে, এটি এতে কোনও সমস্যা পাস thisকরার কারণ হবে না। জিনিসটি বরাদ্দ না দেওয়া থাকলে তা করা অসম্ভব হত।
মিথ্যা রায়ান


5

এটি বর্তমান অবজেক্টের জন্য দাঁড়িয়েছে। আপনি যা করছেন তা সিট্যাটিকভাবে সঠিক তবে আপনি যদি একই ক্লাসে পদ্ধতিটি কল করছেন তবে আমি এর প্রয়োজন দেখছি না।


4
উদাহরণ কোডে, বাজ.মোথোড () হ'ল একটি উদাহরণ পদ্ধতি যা প্যারামিটার হিসাবে বাজের উদাহরণ সহ বার.ফু () বলে। সুতরাং ওপি একই শ্রেণিতে কোনও পদ্ধতি কল করছে না।
ব্যবহারকারী 9

@ মাইকেলকার্জলিং আমার মনে হয় জুনেদ বলছে যে, ফু () পদ্ধতিটি বাজ ক্লাসে স্থানান্তরিত করার thisমাধ্যমে, দুই শ্রেণীর মধ্যে পাস করার প্রয়োজন হবে না । সুতরাং, অতিরিক্ত জটিলতা যুক্ত করার প্রয়োজন নেই।
জেডাব্লু

4

একই আচরণ অর্জনের জন্য যদি কম জটিল বিকল্প থাকে তবে একটি পদ্ধতি কলটিতে বর্তমান অবজেক্টটি পাস করা খারাপ অভ্যাস

সংজ্ঞা অনুসারে, একটি দ্বি-নির্দেশমূলক সমিতি তৈরি করা হয় যত তাড়াতাড়ি thisএকটি জিনিস থেকে অন্য বস্তুর কাছে যায়।

মার্টিন ফাউলারের রিফ্যাক্টরিংয়ের উদ্ধৃতি দিতে:

দ্বি-নির্দেশমূলক অ্যাসোসিয়েশনকে একমুখী (200) এ পরিবর্তন করুন

দ্বি নির্দেশমূলক সমিতিগুলি দরকারী, তবে সেগুলি একটি মূল্য বহন করে। দাম হ'ল দ্বিমুখী লিঙ্কগুলি বজায় রাখার এবং অবজেক্টগুলি যথাযথভাবে তৈরি করা এবং অপসারণের যোগ করার জটিলতা। দ্বি-নির্দেশমূলক সমিতিগুলি অনেক প্রোগ্রামারদের পক্ষে স্বাভাবিক নয়, তাই এগুলি প্রায়শই ত্রুটির উত্স হয়ে থাকে

...

আপনার যখন প্রয়োজন হয় তখন দ্বি-নির্দেশমূলক সমিতিগুলি ব্যবহার করা উচিত when আপনি যত তাড়াতাড়ি দেখতে পাবেন দ্বিপাক্ষিক অ্যাসোসিয়েশন আর তার ওজন টানছে না, অপ্রয়োজনীয় প্রান্তটি ফেলে দিন।

সুতরাং, তাত্ত্বিকভাবে, আমাদের যখন পাস করার দরকার পড়ে তখন আমাদের উচিত অ্যালার্ম বেল শোনা উচিত this মনে এবং হাতের কাছে সমস্যা সমাধানের অন্যান্য উপায়গুলি নিয়ে চিন্তা করার জন্য সত্যই চেষ্টা । অবশ্যই, এমন সময় আছে যখন শেষ অবলম্বনে এটি করার জন্য তা বোধগম্য হয়।

এছাড়াও প্রায়শই সামগ্রিক উন্নতির জন্য আপনার কোডটির দীর্ঘমেয়াদী রিফ্যাক্টরিংয়ের সময় অস্থায়ীভাবে আপনার নকশাটিকে দূষিত করা উচিত 'খারাপ অভ্যাসের জিনিসগুলি' করা। (এক ধাপ পিছনে, দুই ধাপ এগিয়ে)।

অনুশীলনে আমি খুঁজে পেয়েছি যে প্লেগের মতো দ্বি-নির্দেশমূলক লিঙ্কগুলি এড়িয়ে আমার কোডটি ব্যাপকভাবে উন্নত হয়েছে ।


আপনি একটি সরলীকৃত উদাহরণটিকে দ্বিপাক্ষিক লিঙ্ক স্থাপনের প্রয়োজনের সাথে বিভ্রান্ত করেন। এটিকে প্যারামিটার হিসাবে পাস করার পরে, জাভা.এলং সোর্স কোডের উদাহরণ সহ যেমন স্পষ্ট হওয়া উচিত (উদাহরণস্বরূপ আপনি আমার উত্তরটিতে যা দেখেছেন) এর অর্থ এই নয় যে আপনি একটি দ্বিদ্বিতীয় নির্ভরতা যুক্ত করছেন। এই উত্তরটি আমার মতে একটি মন্তব্য হওয়া উচিত ছিল।
অস্বীকার করেন সাগুরেট

@ অডিস্ট্রয় কেন আপনাকে নিম্নচোট করেছেন তা ব্যাখ্যা করার জন্য একটি মন্তব্য যুক্ত করার জন্য ধন্যবাদ Thanks এটি সর্বদা জেনে রাখা ভাল। আমি আমার উত্তরটি পরিস্কার করার জন্য সংশোধন করব যে সংজ্ঞা অনুসারে, দ্বি-নির্দেশমূলক সমিতিটি thisপাশ হওয়ার সাথে সাথেই তৈরি করা হয়।
জেডাব্লু

4
"সংজ্ঞা অনুসারে, এটি পাশ হওয়ার সাথে সাথে একটি দ্বিপাক্ষিক সমিতি তৈরি করা হয়" । আপনি কোথায় বুঝতে ব্যর্থ হন তা এটি পরিষ্কার করে দেয়। আমি যে উদাহরণ দিচ্ছি তা দেখুন। কোনও দ্বি দ্বি নির্দেশমূলক লিঙ্ক নেই কারণ যুক্তির equalsধরণটি অবজেক্ট। এটি খুব সাধারণ: প্রাপ্তি পদ্ধতিটি তার যুক্তিকে আরও সাধারণ শ্রেণি বা একটি ইন্টারফেস হিসাবে সংজ্ঞায়িত করে। জাভাতে এই জাতীয় প্যাটার্ন ব্যবহার করার অন্যতম কারণ হ'ল অবাঞ্ছিত নির্ভরতা এড়ানো। বেশি দিন যাওয়ার আগে আমি আপনাকে সম্মানজনক জাভা লাইব্রেরিতে যুক্তি হিসাবে পাস করার অনেকগুলি ঘটনা একবার দেখে নেওয়ার পরামর্শ দিই this
সাগুরেট

আসুন শুধু মতানৈক্য করতে রাজি। আমার জীবনযাত্রা অনেক সহজ হয়ে গেছে যেহেতু আমি thisআমার কোডটি পাস করা এড়ানো করেছি, যেখানে সম্ভব। আমি অন্যদেরও এটি করার পরামর্শ দিই।
জেডাব্লু

4
@ জেডাব্লু: এই উত্তরে দেওয়া যুক্তি অপ্রাসঙ্গিক। এক্স এর যে কোনও মূল্যের জন্য সহজ কিছু অন্য কিছু যদি সহজ হয় তবে এক্স করা খারাপ ধারণা
লাই রায়ান

4

হ্যাঁ. আপনি এটি ব্যবহার করতে পারেন pass এটি পাস করার জন্য প্রোগ্রামিংয়ে কেবল সাধারণ। তবে এটি ব্যবহারের পক্ষে বিভিন্ন মতামত thisরয়েছে ti তবে এটি করা বিপজ্জনক নয়।


প্রচুর পার্শ্ব প্রতিক্রিয়া রয়েছে। এটি জটিলতা যুক্ত করে।
জেডাব্লু

যদি এই অনেকগুলি পার্শ্ব প্রতিক্রিয়া থাকে তবে আমরা আমাদের জাভা সোর্স কোডে এর মতো একক প্রমাণ খুঁজে পাইনি seসূত্র কোড থেকে @ ডিস্ট্রয়েসের উদাহরণ দেখুন।
সুরেশ আতা

2

পাসিং thisসঠিক যেখানে আরও একটি উদাহরণ যুক্ত করতে এবং ভাল ডিজাইন অনুসরণ করে: দর্শনার্থীর প্যাটার্ন । ভিজিটর ডিজাইনের ধরণে, পদ্ধতিটি accept(Visitor v)কেবলমাত্র কল করার উপায়ে সাধারণত প্রয়োগ করা হয় v.visit(this)


1

গ্রহণযোগ্য

ওরাকল জাভা ডক্স থেকে স্নিপেট:

একটি ইনস্ট্যান্স পদ্ধতি বা কনস্ট্রাক্টরের মধ্যে এটি হ'ল বর্তমান অবজেক্টের - যা বস্তু যার পদ্ধতি বা নির্মাণকারীকে ডাকা হচ্ছে। আপনি এটি ব্যবহার করে একটি উদাহরণ পদ্ধতি বা কোনও নির্মাণকারীর মধ্যে থেকে বর্তমান অবজেক্টের যে কোনও সদস্যকে উল্লেখ করতে পারেন।

একটি ফিল্ড সহ এটি ব্যবহার করে

এই কীওয়ার্ডটি ব্যবহারের সর্বাধিক সাধারণ কারণ হ'ল কোনও ক্ষেত্রটি কোনও পদ্ধতি বা নির্মাতা পরামিতি দ্বারা ছায়াযুক্ত।


4
"আপনি বর্তমান অবজেক্টের যে কোনও সদস্যকে উল্লেখ করতে পারেন " - যা প্রশ্নের উত্তর বলে মনে হচ্ছে না " পরামিতি হিসাবে পাস thisকরা কি গ্রহণযোগ্য ? "
ব্যবহারকারী 9

4
এটি বলছে যে আপনি this.some_variableস্থানীয় ভেরিয়েবলের পরিবর্তে ক্লাস ভেরিয়েবলটি উল্লেখ করতে কীভাবে করতে পারেন । thisপ্যারামিটার হিসাবে পাস করার সাথে এর কোনও যোগসূত্র নেই।
হোসে সালভাটিয়ের

0

জাভাতে সমস্ত কিছু মান দিয়ে যায়। কিন্তু অবজেক্টগুলি কখনও পদ্ধতিতে পাস হয় না!
জাভা যখন কোনও বস্তুর কাছে কোনও বস্তুকে পাস করে, তখন প্রথমে এটি বস্তুর রেফারেন্সের একটি অনুলিপি তৈরি করে, বস্তুর নিজেই অনুলিপি করে না। সুতরাং এটি জাভা মধ্যে pefectly পদ্ধতি ব্যবহার করা হয়। এবং সর্বাধিক ব্যবহৃত অনুসরণ


9
এটি বিষয় দেখায়।
সাগুরেট

4
"জাভাতে সমস্ত কিছু মান দিয়ে যায়" " - এটি একটি খুব বিভ্রান্তিমূলক প্রাথমিক মন্তব্য। আসলে সমস্ত বস্তু রেফারেন্স দ্বারা পাস হয় এবং সমস্ত আদিম ধরণের মান দ্বারা পাস হয়। আপনার কাছে কখনও thisআদিম ধরণের রেফারেন্স নেই, এবং তাই আমি মনে করি আপনার "আরও তথ্য" বিভ্রান্তি প্রবর্তন করছে।
স্টুয়ার্ট

4
@ স্টাওয়ার্ট: তিনি তাত্ক্ষণিকভাবে পরিষ্কার করে দিয়েছিলেন যে তার অর্থ এই নয় যে পুরো বস্তু অনুলিপি করা হয়েছে।
LarsH

10
@ স্টিওয়ার্ট নং, অবজেক্টগুলি রেফারেন্স দ্বারা পাস করা হয় না , বরং অবজেক্টের রেফারেন্সগুলি মান দ্বারা পাস হয়। এটি একটি গুরুত্বপূর্ণ পার্থক্য - রেফারেন্স দিয়ে পাস করার অর্থ হ'ল যদি আমার কাছে একটি স্থানীয় ভেরিয়েবল থাকে যা কোনও অবজেক্টকে বোঝায় এবং সেই ভেরিয়েবলটিকে অন্য পদ্ধতিতে পাস করিয়ে দেয় তবে পদ্ধতিটি আমার ভেরিয়েবলটি কোন বিষয়টিকে বোঝায় তা পরিবর্তন করতে সক্ষম হবে এবং এটি অবশ্যই কিছু নয় আপনি জাভা করতে পারেন। পদ্ধতি করতে রেফারেন্স নিজস্ব কপি মাধ্যমে বস্তুর রাষ্ট্র পরিবর্তন ঘটান কিন্তু এটি অন্য কিছু বিন্দু রেফারেন্স আমার কপি পরিবর্তন করতে পারবেন না।
ইয়ান রবার্টস

4
@ স্টেটওয়ার্ট yoda.arachsys.com/csharp/paraters.html একটি ভাল নিবন্ধ যা রেফারেন্স দ্বারা পাস এবং রেফারেন্সকে মান দ্বারা পাস করার মধ্যে পার্থক্য ব্যাখ্যা করে, সি # এর প্রসঙ্গে যা উভয়কেই সমর্থন করে।
ইয়ান রবার্টস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.