কখন আমার ক্লাসে "এটি" ব্যবহার করা উচিত?


267

আমি জানি যে thisএকটি বর্তমান অবজেক্ট বোঝায়। তবে কখনই আমার এটি ব্যবহার করা দরকার তা আমি জানি না। উদাহরণস্বরূপ, আমি যদি কিছু পদ্ধতির xপরিবর্তে ব্যবহার করি তবে কি কোনও পার্থক্য থাকবে this.x? xবিবেচিত পদ্ধতির জন্য স্থানীয় যা একটি পরিবর্তনশীল উল্লেখ করতে পারে ? আমি পরিবর্তনশীল বলতে চাই যা কেবল এই পদ্ধতিতে দেখা যায়।

কি হবে this.method()? আমি কি এটা ব্যবহার করতে পারি? আমি এটা ব্যবহার করা উচিত। আমি যদি কেবল ব্যবহার করি তবে এটি method()কি পূর্বনির্ধারিতভাবে বর্তমান অবজেক্টে প্রয়োগ করা হবে না?

উত্তর:


347

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

কেস 1:this ভেরিয়েবল রেফারেন্সগুলি ছিন্ন করতে ব্যবহার করা। জাভা সেটার পদ্ধতিগুলিতে আমরা সাধারণত বেসরকারী সদস্য ভেরিয়েবলটি সেট করার চেষ্টা করছি সেই একই নামে একটি যুক্তিতে পাস করি। আমরা তখন যুক্তি ধার্য xকরতে this.x। এটি পরিষ্কার করে দেয় যে আপনি উদাহরণের পরিবর্তনশীল "নাম" পরামিতি "নাম" এর মান নির্ধারণ করছেন।

public class Foo
{
    private String name;

    public void setName(String name) {
        this.name = name;
    }
}

কেস 2:this একটি যুক্তি হিসাবে অন্য বস্তুর কাছে প্রেরণ হিসাবে ব্যবহার করা।

public class Foo
{
    public String useBarMethod() {
        Bar theBar = new Bar();
        return theBar.barMethod(this);
    }

    public String getName() {
        return "Foo";
    }
}

public class Bar
{
    public void barMethod(Foo obj) {
        obj.getName();
    }
}

কেস 3:this বিকল্প নির্মাণকারীদের কল করতে ব্যবহার করা। মন্তব্যে, ত্রিনিথিস সঠিকভাবে অন্য একটি সাধারণ ব্যবহার নির্দেশ করেছেন this। যখন আপনার একক শ্রেণীর জন্য একাধিক কনস্ট্রাক্টর রয়েছে, আপনি this(arg0, arg1, ...)আপনার পছন্দসই আরেকটি কনস্ট্রাক্টরকে কল করতে ব্যবহার করতে পারেন , তবে আপনি যদি আপনার নির্মাণকারীর প্রথম লাইনে এটি করেন।

class Foo
{
    public Foo() {
        this("Some default value for bar");

        //optional other lines
    }

    public Foo(String bar) {
        // Do something with bar
    }
}

আমি এও thisজোর দিয়ে দেখেছি যে একটি উদাহরণ পরিবর্তনশীল উল্লেখ করা হচ্ছে (ছদ্মবেশের প্রয়োজনকে বোঝায়) তবে এটি আমার মতে বিরল ঘটনা।


21
+1 টি উল্লেখ আপনার কাছে প্রেরণ করতে পারেন যে জন্য এই একটি আর্গুমেন্ট হিসাবে। এটি কেবল স্কোপ বিযুক্তির জন্যই ব্যবহৃত হয় না used
অ্যালেক্স জেসমিন

12
অবশ্যই this(arg1, arg2, ...)একটি কনস্ট্রাক্টরের ভিতরেও রয়েছে ।
টমাস এডিং

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

4
আপনার কেস 1 এবং 3 এর উদাহরণ রয়েছে? আপনি দয়া করে কেস 2 এর উদাহরণ দিতে পারেন যেখানে বর্তমান শ্রেণীর উদাহরণটি অন্য শ্রেণীর পদ্ধতির জন্য আর্গুমেন্ট হিসাবে ব্যবহৃত হয়?
dbconfession

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

71

thisনেস্টেড অ-স্থিতিশীল শ্রেণীর বাইরের উদাহরণ অ্যাক্সেস করার সময় (যেমন অনেক উত্তর ইতিমধ্যে বলেছে স্থানীয় ভেরিয়েবলটি লুকিয়ে রাখার পাশাপাশি) দ্বিতীয় গুরুত্বপূর্ণ ব্যবহার :

public class Outer {
  protected int a;

  public class Inner {
    protected int a;

    public int foo(){
      return Outer.this.a;
    }

    public Outer getOuter(){
      return Outer.this;
    }
  }
}

46

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

অবশ্যই, ব্যবহারের thisআর একটি ভাল কারণ হ'ল এটি আইডিইগুলিতে পপ আপ করতে ইন্টেলিজেন্সের কারণ ঘটায় :)


1
তবে তারপরে এটি দেখার পরে আপনাকে এটিকে ব্যাকস্পেস করতে হবে। প্রোগ্রামিং ক্লান্তিকর!
কিংবদন্তি লেন্থথ

25

কোয়ালিফায়ার ব্যবহারের প্রয়োজন কেবল তখনই this.হয় যখন বর্তমান স্কোপের মধ্যে অন্য কোনও পরিবর্তনশীল একই নামটি ভাগ করে নেয় এবং আপনি উদাহরণ সদস্যটির সাথে উল্লেখ করতে চান (যেমন উইলিয়াম বর্ণনা করেছেন)। তদন্য, তার মাঝে আচরণের কোন পার্থক্য xএবং this.x


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

3
@ চাদ: জাভা সেটার পদ্ধতিতে এটি সাধারণ অনুশীলন। তবে সেটার পদ্ধতির বাইরে আপনার বক্তব্যগুলি সাধারণত ধারণ করে।
উইলিয়াম ব্রেন্ডেল

2
আপনি this.xআপনার কোডটি আরও কিছুটা আরও স্পষ্টভাবে পড়ার জন্য ব্যবহার করতে চাইতে পারেন ,
কোডটির

1
@ চাদ: আমি যথেষ্ট উত্সাহীভাবে একমত হতে পারি না। শুভ পালনকর্তা, "কারণ" আপনাকে দুটি ভিন্ন ভেরিয়েবল একই নাম দেওয়ার অনুমতি দেয়, আপনি কেন চান?
ব্লেয়ারহিপ্পো

2
@ ব্লেয়ার: আপনার উত্তরটি পড়া এটি পরিষ্কার করে দেয় যে আপনি সেটার পদ্ধতিতে এই অনুশীলনটি পছন্দ করেন না, তবে অনেকেই করেন (আমি নিজেকে সেই তালিকায় অন্তর্ভুক্ত করব)। যদি আমার কাছে সেটার পদ্ধতি থাকে যা একটি মান নেয় তবে স্পষ্টভাবে পাস করা মানটি "নতুন" মান হতে হবে, সুতরাং ভেরিয়েবল নামেরটিতে "নতুন" যুক্ত করা পাবলিক এপিআইতে অযথা অনর্থক যোগ করবে বলে মনে হয়।
অ্যাডাম রবিনসন

15

অন্য একজনের কাছ থেকে একজন কনস্ট্রাক্টরকে কল করার সময় "এই "টিও কার্যকর:

public class MyClass {
    public MyClass(String foo) {
        this(foo, null);
    }
    public MyClass(String foo, String bar) {
        ...
    }
}

11

this বিল্ডার প্যাটার্নে দরকারী।

public class User {

    private String firstName;
    private String surname;

    public User(Builder builder){
        firstName = builder.firstName;
        surname = builder.surname;
    }

    public String getFirstName(){
        return firstName;
    }

    public String getSurname(){
        return surname;
    }

    public static class Builder {
        private String firstName;
        private String surname;

        public Builder setFirstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder setSurname(String surname) {
            this.surname = surname;
            return this;
        }

        public User build(){
            return new User(this);
        }

    }

    public static void main(String[] args) {
        User.Builder builder = new User.Builder();
        User user = builder.setFirstName("John").setSurname("Doe").build();
    }

}

1
আমি অনুসন্ধান করতে এবং এখানে শেষ করতে পেরে আমি এই ধরণের জবাব চেয়েছিলাম, তবে আপনার কোড সম্পর্কে আপনার কোনও ব্যাখ্যা নেই, সুতরাং বেশিরভাগ লোকেরা যারা "এটি" সম্পর্কে জিজ্ঞাসা করছেন তারা বুঝতে পারবেন না "নতুন ব্যবহারকারী (এটি) কী ফিরে আসবে;" মানে, যেমনটি আমি করি না ...
nckbrz

বিল্ডার প্যাটার্নটি নির্মাণে পরিষ্কারভাবে পরামিতি নির্দিষ্ট করতে ব্যবহৃত হয়। কোন নতুন স্ট্রিংটি কোন স্ট্রিংটি ছিল তা বলার সহজ উপায় ছাড়াই নতুন ব্যবহারকারীর (স্ট্রিং, স্ট্রিং) পরিবর্তে আপনি নতুন বিল্ডার () স্থাপন করেছেন ফার্স্টনাম ("জেন") set সেটনাম ("স্মিথ") build আপনি এটি বিল্ডার.সেট ... () ফাংশন থেকে ফিরিয়ে দেন যাতে আপনি তাদের চেইন করতে পারেন।
ক্রিসফিনিক্স

10

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

এটি কল্পনা করুন:

public class Hello {
    private String foo;

    // Some 10k lines of codes

    private String getStringFromSomewhere() {
        // ....
    }

    // More codes

    public class World {
        private String bar;

        // Another 10k lines of codes

        public void doSomething() {
            // More codes
            foo = "FOO";
            // More codes
            String s = getStringFromSomewhere();
            // More codes
            bar = s;
        }
    }
}

যে কোনও আধুনিক আইডিই সহ এটি পড়ার বিষয়টি খুব স্পষ্ট, তবে এটি নিয়মিত পাঠ্য সম্পাদক দ্বারা পড়া মোট দুঃস্বপ্ন হবে।

আপনি fooসম্পাদকের "সন্ধান" ফাংশনটি ব্যবহার না করা পর্যন্ত আপনি কোথায় থাকবেন তা খুঁজে পেতে লড়াই করতে হবে । তারপরে আপনি getStringFromSomewhere()একই কারণে চিৎকার করবেন । সবশেষে, আপনি যা ভুলে যাবেন তার পরে s, এটি bar = sআপনাকে চূড়ান্ত আঘাত দেবে।

এটির সাথে এর তুলনা করুন:

public void doSomething() {
    // More codes
    Hello.this.foo = "FOO";
    // More codes
    String s = Hello.this.getStringFromSomewhere();
    // More codes
    this.bar = s;
}
  1. আপনি জানেন fooবহিরাগত শ্রেণিতে ঘোষিত একটি পরিবর্তনশীল Hello
  2. আপনি জানেন getStringFromSomewhere()যে বাইরের শ্রেণিতেও ঘোষিত একটি পদ্ধতি।
  3. আপনি জানেন যে শ্রেণীর barঅন্তর্গত World, এবং sসেই পদ্ধতিতে ঘোষণা করা একটি স্থানীয় পরিবর্তনশীল।

অবশ্যই আপনি যখনই কোনও ডিজাইন করেন, আপনি নিয়ম তৈরি করেন। তাই যখন আপনার এপিআই বা প্রকল্প নকশা, আপনার নিয়ম অন্তর্ভুক্ত যদি "কেউ একটি নোটপ্যাড দিয়ে এই সব সোর্স কোড প্রর্দশিত যদি, সে তার মাথায় গুলি করা উচিত / নিজেকে," তাহলে আপনি সম্পূর্ণই সূক্ষ্ম না হয় এই


মহান উত্তর @Jai
গৌরব

অঙ্কুরের প্রথম কারণটি হ'ল কয়েকটি 10k লাইনের কোড সহ ক্লাস রচনা করা বিশেষত যদি কোডটি ইতিমধ্যে বিভিন্ন শ্রেণিতে বিভক্ত করা হয় যা নেস্ট করার দরকার নেই :)
লুসিও

@ লুসিও লল সত্য এক্সডি
জয়

7

যদি আপনার ভেরিয়েবলের নামগুলি ওভারল্যাপিং না করে থাকে তবে আপনি কোডটি পড়ার সময় এটি কেবল স্পষ্টতার জন্য।


1
যখন আপনি ক্রমাগত thisকীওয়ার্ডটি দেখেন যখন এটির প্রয়োজন হয় না এটি কেবল বয়লারপ্লেট কোডই কোডটি পড়া আরও শক্ত করে তোলে।
এক্সিএফেক্ট

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

4
@ অ্যাক্সেসএফেক্ট আমি জানি এটি সত্যই পুরানো তবে ... কোডটি lmao thisপড়া আরও শক্ত করে না।
জাতেনেভ

4

@ উইলিয়াম ব্রেন্ডেল উত্তরটি তিনটি ব্যবহারের সুন্দর পদ্ধতি সরবরাহ করেছে।

কেস 1 ব্যবহার করুন:

উপর সরকারী জাভা ডকুমেন্টেশন পৃষ্ঠাটিতে এই একই ব্যবহার-মামলা প্রদান করে।

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

এটি দুটি উদাহরণ কভার করে:

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

কেস 2 ব্যবহার করুন:

এই পোস্টে উদ্ধৃত হয়নি এমন অন্যান্য ব্যবহারের ক্ষেত্রে: thisডেটা এবং পদ্ধতির সমালোচনা বিভাগটি রক্ষা করতে একাধিক-থ্রেড অ্যাপ্লিকেশনটিতে বর্তমান অবজেক্টটি সিঙ্ক্রোনাইজ করতে ব্যবহার করা যেতে পারে।

synchronized(this){
    // Do some thing. 
}

কেস 3 ব্যবহার করুন:

বিল্ডার প্যাটার্নের বাস্তবায়ন thisপরিবর্তিত বস্তুটি ফেরত দেওয়ার জন্য ব্যবহারের উপর নির্ভর করে ।

এই পোস্টে দেখুন

নির্মাতাকে আলাদা শ্রেণিতে রাখা (সাবলীল ইন্টারফেস)


2

গুগল সূর্যের সাইটে একটি পৃষ্ঠা তৈরি করেছে যা এটি কিছুটা আলোচনা করে।

আপনি ভেরিয়েবল সম্পর্কে ঠিক বলেছেন; thisশ্রেণিক ক্ষেত্র থেকে কোনও পদ্ধতি পরিবর্তনশীলকে পৃথক করতে প্রকৃতপক্ষে ব্যবহার করা যেতে পারে।

    private int x;
    public void setX(int x) {
        this.x=x;
    }

যাইহোক, আমি সত্যিই যে সম্মেলন ঘৃণা করি। দুটি ভিন্ন ভিন্ন ভেরিয়েবল আক্ষরিকভাবে অভিন্ন নাম দেওয়া বাগের রেসিপি। আমি অনেকটা এর লাইনে কিছু পছন্দ করি:

    private int x;
    public void setX(int newX) {
        x=newX;
    }

একই ফলস্বরূপ, তবে কোনও বাগের কোনও সম্ভাবনা ছাড়াই যেখানে আপনি দুর্ঘটনাক্রমে উল্লেখ করেছেন xযখন আপনি আসলে xপরিবর্তে উল্লেখ করছেন to

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


4
এটি কোনও সম্মেলন নয়, এটি একটি প্রোগ্রামের ভাষা স্কোপিংয়ের প্রক্রিয়া। আপনি কী তালিকাভুক্ত করেছেন - নিউএক্স ব্যবহার করে (আমি প্যারামিটার এক্সের জন্য পিএক্স পছন্দ করি) এটি একটি কনভেনশন।
বিল কে

@ বিল কে: আপনি যে পার্থক্য করছেন তা আমি বুঝতে পারি না। আমি ইনপুট ভেরিয়েবল এক্স, বা নিউএক্স, বা পিএক্স, বা ম্যানগ্রোভথ্রটওয়্যারব্লেরএক্সের নাম চয়ন করতে পারি। "নতুন" বা "পি" বা "গ্রেটুইটাস মন্টি পাইথন রেফারেন্স" এর কনভেনশনগুলির প্রিভিং করার সময়, কীভাবে এটি একটি কনভেনশন নয় সেটি পরিবর্তনশীল হিসাবে একটি নাম দেওয়ার মতো কীভাবে বেছে নিচ্ছেন?
ব্লেয়ারহিপ্পো

3
"গ্রেটুইটউড মন্টি পাইথন রেফারেন্স" কোনও কনভেনশন নয়, এটি আইনশাসন।
অ্যাডাম রবিনসন

+1: এই কারণে ক্লাস ভেরিয়েবলের চেয়ে আমরা আর্গুমেন্ট এবং পদ্ধতি ভেরিয়েবলের জন্য একটি ভিন্ন নামকরণের মান ব্যবহার করি। আমরা আর্গুমেন্ট / পদ্ধতির ভার সংক্ষিপ্ত করে ক্লাস / ইনস্ট্যান্স ভেরিয়েবলের জন্য পূর্ণ শব্দ ব্যবহার করি।
লরেন্স ডল

1
নামকরণ কনভেনশন ব্যবহার করে এটি সমাধান করা হুম, একটি সম্মেলন। কোনও ভাষা বৈশিষ্ট্য ব্যবহার করে এটি সমাধান করা - আমি অনুমান করি যে ভাষা বৈশিষ্ট্যটি কখনই ব্যবহার না করা বা সর্বদা এটি ব্যবহার করা একটি সম্মেলন হবে ... এটি ব্যবহার করে ... প্রতিটি সময় আপনি সদস্য অ্যাক্সেস একটি সম্মেলন হতে হবে। অনুমান করুন এটি খুব বেশি গুরুত্ব দেয় না, আমি ঘৃণা করি .এটিও।
বিল কে

2

জাভাতে 'এই' কীওয়ার্ডটি ব্যবহারের উপায়গুলি নীচে:

  1. thisবর্তমান শ্রেণীর উদাহরণের ভেরিয়েবলগুলি উল্লেখ করতে কীওয়ার্ড ব্যবহার করা
  2. this()বর্তমান শ্রেণি নির্মাতা প্রার্থনা করতে ব্যবহার
  3. thisবর্তমান শ্রেণীর উদাহরণটি ফিরিয়ে দিতে কীওয়ার্ড ব্যবহার করা
  4. thisপদ্ধতি পরামিতি হিসাবে কীওয়ার্ড ব্যবহার করে

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html


1

যখন দুটি ভেরিয়েবল থাকে একটি উদাহরণ ভেরিয়েবল এবং একই নামের অন্যান্য স্থানীয় ভেরিয়েবল তখন আমরা এটি ব্যবহার করি। নামের মধ্যে দ্বন্দ্ব এড়াতে বর্তমান নির্বাহক অবজেক্টটি উল্লেখ করুন।


1

thisএটি বর্তমান অবজেক্টের একটি রেফারেন্স। এটি নির্মাণকারীর সাথে স্থানীয় এবং বর্তমান শ্রেণীর ভেরিয়েবলের একই নাম রয়েছে বলে পার্থক্য করতে ব্যবহৃত হয়। উদাহরণ:

public class circle {
    int x;
    circle(int x){
        this.x =x;
        //class variable =local variable 
    }
} 

thisঅন্য কনস্ট্রাক্টর থেকে একজন কনস্ট্রাক্টরকে কল করতেও ব্যবহার করা যেতে পারে। উদাহরণ:

public class circle {
    int x;

    circle() { 
        this(1);
    }

    circle(int x) {
        this.x = x; 
    }
}

0

আমি যদি কিছু পদ্ধতিতে "this.x" এর পরিবর্তে "x" ব্যবহার করি তবে কি কোনও পার্থক্য হবে?

সাধারণত না। তবে এটি কখনও কখনও একটি পার্থক্য করে:

  class A {
     private int i;
     public A(int i) {
        this.i = i; // this.i can be used to disambiguate the i being referred to
     }
  }

আমি যদি কেবল "পদ্ধতি ()" ব্যবহার করি তবে এটি কি পূর্বনির্ধারিতভাবে বর্তমান অবজেক্টে প্রয়োগ করা হবে না?

হ্যাঁ. তবে প্রয়োজনে, this.method()স্পষ্ট করে যে কলটি এই অবজেক্টের দ্বারা করা হয়েছিল।


0

thisফলস্বরূপ কোডটি প্রভাবিত করে না - এটি সংকলন সময় অপারেটর এবং এর সাথে বা ছাড়াই উত্পন্ন কোডটি একই হবে। আপনি এটি ব্যবহার করতে হবে, প্রসঙ্গে উপর নির্ভর করে। উদাহরণস্বরূপ আপনাকে এটি ব্যবহার করতে হবে, যেমন আপনি বলেছিলেন, যখন আপনার স্থানীয় ভেরিয়েবল থাকে যা ছায়াযুক্ত শ্রেণি ভেরিয়েবল এবং আপনি শ্রেণি ভেরিয়েবল উল্লেখ করতে চান তবে স্থানীয় নয়।

সম্পাদনা করুন: "ফলস্বরূপ কোডটি একই রকম হবে" আমি অবশ্যই বলতে চাইছি, যখন স্থানীয় স্কোপে কিছু পরিবর্তনশীল শ্রেণীর অন্তর্ভুক্তটিকে আড়াল না করে। এইভাবে

class POJO {
   protected int i;

   public void modify() {
      i = 9;
   }

   public void thisModify() {
      this.i = 9;
   }
}

উভয় পদ্ধতির ফলাফল কোড একই হবে। পার্থক্যটি হবে যদি কোনও পদ্ধতি একই নামের সাথে স্থানীয় ভেরিয়েবল ঘোষণা করে

  public void m() {
      int i;
      i = 9;  // i refers to variable in method's scope
      this.i = 9; // i refers to class variable
  }

0

থেকে সম্মান সঙ্গে উইলিয়াম Brendel এর পোস্ট এবং dbconfessions প্রশ্ন সংক্রান্ত কেস 2 । এখানে একটি উদাহরণ:

public class Window {

  private Window parent;

  public Window (Window parent) {
    this.parent = parent;
  }

  public void addSubWindow() {
    Window child = new Window(this);
    list.add(child);
  }

  public void printInfo() {
    if (parent == null) {
      System.out.println("root");
    } else {
      System.out.println("child");
    }
  }

}

পিতামাতার সাথে সন্তানের সম্পর্কগুলি যখন বস্তুর সাথে তৈরি করা হয় তখন আমি এটি ব্যবহার করে দেখেছি। যাইহোক, দয়া করে নোট করুন যে এটি বংশবৃদ্ধির জন্য সরল করা হয়েছে।


0

জাভাতে "এই" কীওয়ার্ডটি বর্তমান শ্রেণীর অবজেক্টগুলিকে উল্লেখ করতে ব্যবহৃত হয়।

জাভাতে "এই" কীওয়ার্ডের 6 টি ব্যবহার রয়েছে

  1. শ্রেণি স্তরের ভেরিয়েবল অ্যাক্সেস করা : বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয় যদি স্থানীয় এবং শ্রেণি স্তরের ভেরিয়েবল একই থাকে
  2. শ্রেণীর পদ্ধতিতে অ্যাক্সেস করা : এটি ডিফল্ট আচরণ এবং এড়ানো যায়
  3. একই বর্গের অন্যান্য কনস্ট্রাক্টরকে কল করার জন্য
  4. 'এই' কীওয়ার্ডটি রিটার্ন মান হিসাবে ব্যবহার করে : পদ্ধতি থেকে বর্তমান উদাহরণটি ফেরত দেওয়ার জন্য
  5. পদ্ধতির পক্ষে আর্গুমেন্ট হিসাবে 'এই' কীওয়ার্ডটি পাস করা: বর্তমান শ্রেণীর উদাহরণকে তর্ক হিসাবে পাস করার জন্য
  6. এই কীওয়ার্ডটি কনস্ট্রাক্টরের আর্গুমেন্ট হিসাবে : বর্তমান বর্গ উদাহরণটি আর্গুমেন্ট হিসাবে পাস করার জন্য

রেফ: https://stacktraceguru.com/java/this-keyword-in-java


-8

বর্তমান অবজেক্টের সদস্যরা ব্যবহৃত হয়েছে তা নিশ্চিত করতে। যে ক্ষেত্রে থ্রেড সুরক্ষা একটি উদ্বেগের বিষয়, কিছু অ্যাপ্লিকেশনগুলি ভুল অবজেক্টের সদস্যের মানগুলিকে পরিবর্তন করতে পারে, সেই কারণেই এটি সদস্যকে প্রয়োগ করা উচিত যাতে সঠিক অবজেক্টের সদস্য মানটি ব্যবহার করা যায়।

যদি আপনার অবজেক্টটি থ্রেড সুরক্ষার সাথে সম্পর্কিত না হয় তবে কোন বস্তুর সদস্যের মান ব্যবহৃত হবে তা নির্দিষ্ট করার কোনও কারণ নেই।


এটা আসলে ঘটনা নয়। আপনি কী মামলার কথা ভাবছেন তা সম্পর্কে আমি নিশ্চিত নই, তবে আপনি কী বলতে চাইছেন তা বোঝার জন্য একটি উদাহরণ সহায়ক হতে পারে।
ডেভিড বার্গার

1
হ্যাঁ. আমি জানি আপনি কী ব্যাখ্যা করছেন তাতে থ্রেড নিরাপত্তা জড়িত। থ্রেড নিরাপত্তা জড়িত এই প্রশ্নের সঠিক কোনও উত্তর নেই। যদি "এটি" সঠিক অবজেক্টের উল্লেখ করা প্রয়োজন হয়, তবে এটি একবার করলে পদ্ধতি বা বৈশিষ্ট্যটি সুসংগত হলে কেবল এবং এটিই সিঙ্ক্রোনাইজ করা হবে। যদি রেফারেন্সটি একেবারেই অস্পষ্ট হয় তবে মাল্টি-থ্রেডিং কোনও সমস্যা কিনা তা অস্পষ্ট হবে।
ডেভিড বার্গার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.