ฉันควรใช้“ สิ่งนี้” ในชั้นเรียนเมื่อใด


267

ฉันรู้ว่าthisหมายถึงวัตถุปัจจุบัน แต่ฉันไม่รู้ว่าเมื่อไรฉันต้องใช้มันจริงๆ ตัวอย่างเช่นจะมีความแตกต่างหรือไม่หากฉันใช้xแทนthis.xวิธีการบางอย่าง? อาจxจะหมายถึงตัวแปรซึ่งเป็นท้องถิ่นสำหรับวิธีการพิจารณา? ฉันหมายถึงตัวแปรที่เห็นในวิธีนี้เท่านั้น

เกี่ยวกับthis.method()อะไร ฉันสามารถใช้มันได้หรือไม่ ฉันควรจะใช้มัน ถ้าฉันเพิ่งใช้method()มันจะไม่ถูกนำไปใช้กับวัตถุปัจจุบันหรือไม่

คำตอบ:


347

thisคำหลักที่ถูกนำมาใช้เป็นหลักในสามสถานการณ์ ครั้งแรกและที่พบมากที่สุดคือในวิธีการตั้งค่าเพื่อ disambiguate อ้างอิงตัวแปร ที่สองคือเมื่อมีความจำเป็นต้องผ่านอินสแตนซ์ของคลาสปัจจุบันเป็นอาร์กิวเมนต์ไปยังวิธีการของวัตถุอื่น ที่สามเป็นวิธีการเรียก constructors สำรองจากภายในนวกรรมิก

กรณีที่ 1:การใช้thisเพื่อแก้ปัญหาการอ้างอิงตัวแปร ในเมธอดเซ็ตเตอร์ Java เรามักส่งผ่านอาร์กิวเมนต์ที่มีชื่อเดียวกันกับตัวแปรสมาชิกส่วนตัวที่เรากำลังพยายามตั้งค่า จากนั้นเราจะกำหนดโต้แย้งไปx this.xสิ่งนี้ทำให้ชัดเจนว่าคุณกำลังกำหนดค่าของพารามิเตอร์ "name" ให้กับตัวแปร instance "name"

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เพื่อเรียก constructors สำรอง ในความคิดเห็นที่trinithisthisชี้ได้อย่างถูกต้องออกมาอีกใช้งานทั่วไปของ เมื่อคุณมีคอนสตรัคเตอร์หลายตัวสำหรับคลาสเดียวคุณสามารถใช้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 สำหรับการกล่าวถึงว่าคุณสามารถส่งผ่านสิ่งนี้เป็นอาร์กิวเมนต์ได้ สิ่งนี้ไม่เพียงถูกนำมาใช้เพื่อลดความคลาดเคลื่อนของขอบเขต
— Alex Jasmin

12
แน่นอนว่ายังมีthis(arg1, arg2, ...)ในตัวสร้าง
— Thomas Eding

12
@Hazior: ฉันมักจะเขียนคำตอบสั้น ๆ แล้วเพิ่มไปเมื่อเวลาผ่านไป บางครั้งที่ทับซ้อนกับคำตอบของคนอื่นบางครั้งก็ไม่ ในกรณีที่มีการแก้ไขล่าสุดของฉัน trinithis ชี้ให้เห็นการใช้งานทั่วไปอีกอย่างthisที่ฉันลืมดังนั้นฉันจึงเพิ่มคำตอบของฉันลงไป ฉันไม่เห็นอะไรผิดปกติเพราะผลลัพธ์สุดท้ายเป็นคำตอบที่ดีกว่าโดยรวมซึ่งเป็นจุดประสงค์ของ SO อย่างแม่นยำ ฉันก็พยายามให้เครดิตเท่าที่จะเป็นไปได้เช่นเดียวกับที่ฉันทำในกรณีของ trinithis
— William Brendel

4
คุณมีตัวอย่างสำหรับกรณีที่ 1 และ 3 คุณช่วยยกตัวอย่างกรณีที่ 2 ซึ่งใช้อินสแตนซ์ของคลาสปัจจุบันเป็นอาร์กิวเมนต์สำหรับเมธอดของคลาสอื่นได้หรือไม่?
— dbconfession

4
@AStar ในโค้ด Java ส่วนใหญ่ที่ฉันเคยใช้งานมาหลายปีthisจะใช้เฉพาะในกรณีที่จำเป็นต้องใช้ความเข้าใจอย่างแท้จริงเช่นในตัวอย่าง setter ของฉันด้านบน รูปแบบการเข้ารหัสและ "วิธีปฏิบัติที่ดีที่สุด" อาจแตกต่างกันไปขึ้นอยู่กับผู้ที่คุณถามแน่นอน แต่โดยทั่วไปแล้วฉันแนะนำให้เลือกรูปแบบที่เหมาะสมและติดกับพวกเขา ความสอดคล้องแม้เพียงแค่ภายในรหัสฐานเดียวก็สามารถอ่านและบำรุงรักษาได้ไกล
— William Brendel

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คือมันทำให้เกิด intellisense ปรากฏขึ้นใน IDEs :)


1
แต่คุณต้องถอยกลับหลังจากที่คุณค้นหา การเขียนโปรแกรมเหนื่อย!
— LegendLength

25

ความต้องการใช้ตัวระบุเฉพาะthis.เมื่อตัวแปรอื่นภายในขอบเขตปัจจุบันใช้ชื่อเดียวกันและคุณต้องการอ้างถึงสมาชิกอินสแตนซ์ (เช่น William อธิบาย) นอกเหนือจากที่มีความแตกต่างในการทำงานไม่มีระหว่างและxthis.x


3
และถ้าคุณมีชื่อที่ซ้ำกันตัวแปรตัวใดตัวหนึ่งของคุณควรเปลี่ยนชื่อเพราะมันตั้งชื่อไม่ถูกต้อง หรืออย่างน้อยที่สุดก็สามารถตั้งชื่อได้ดีกว่า
— CaffGeek

3
@Chad: เป็นวิธีปฏิบัติทั่วไปในวิธี setter Java อย่างไรก็ตามโดยทั่วไปแล้ววิธีการตั้งค่าของคุณจะมีงบอยู่
— William Brendel

2
คุณอาจต้องการใช้this.xเพื่อทำให้โค้ดของคุณอ่านชัดเจนยิ่งขึ้นการบำรุงรักษา / ความสามารถในการอ่านของโค้ดเป็นปัจจัยที่คุณควรพิจารณา ...
— Bryan Rehbein

1
@Chad: ฉันไม่สามารถเห็นด้วยอย่างกระตือรือร้นพอ ท่านผู้ดีเพียงเพราะ "สิ่งนี้" อนุญาตให้คุณตั้งชื่อเหมือนกันสองตัวแปรทำไมคุณถึงต้องการ
— BlairHippo

2
@ แบลร์: การอ่านคำตอบของคุณทำให้เห็นได้ชัดว่าคุณไม่ชอบการฝึกฝนนี้ในวิธีการเซ็ตเทอร์ แต่มีหลายคนที่ทำ ถ้าฉันมีเมธอด setter ที่รับค่าอย่างชัดเจนว่าค่าที่ส่งผ่านนั้นจะเป็นค่า "ใหม่" ดังนั้นการเพิ่ม "ใหม่" ให้กับชื่อตัวแปรดูเหมือนว่าจะเพิ่มความซ้ำซ้อนที่ไม่จำเป็นลงใน API สาธารณะ
— อดัมโรบินสัน

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

รูปแบบของตัวสร้างใช้เพื่อระบุพารามิเตอร์ที่ชัดเจนเกี่ยวกับการก่อสร้าง แทนที่จะมีผู้ใช้ใหม่ (สตริง, สตริง) โดยไม่มีวิธีที่ง่ายในการบอกว่าเป็นสตริงใดคุณจะมี Builder ใหม่ () setFirstName ("Jane") setSurname ("Smith"). build () คุณส่งคืนสิ่งนี้จากฟังก์ชัน Builder.set ... () เพื่อให้คุณสามารถโยงมันได้
— ChrisPhoenix

10

มีคำตอบที่ดีมากมาย แต่ก็มีอีกเหตุผลเล็กน้อยที่ให้thisทุกที่ หากคุณได้ลองเปิดซอร์สโค้ดของคุณจาก text editor ธรรมดา (เช่น notepad เป็นต้น) การใช้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;
        }
    }
}

นี่เป็นสิ่งที่ชัดเจนมากที่จะอ่านกับ IDE ที่ทันสมัยใด ๆ แต่นี่จะเป็นฝันร้ายทั้งหมดที่จะอ่านด้วยโปรแกรมแก้ไขข้อความปกติ

คุณจะต้องดิ้นรนหาที่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. คุณจะรู้ว่าเป็นตัวแปรประกาศในชั้นเรียนนอกfooHello
  2. คุณรู้ว่าgetStringFromSomewhere()เป็นวิธีการประกาศในชั้นนอกเช่นกัน
  3. คุณรู้ว่าbarเป็นของWorldชั้นเรียนและsเป็นตัวแปรท้องถิ่นประกาศในวิธีการที่

แน่นอนว่าเมื่อใดก็ตามที่คุณออกแบบบางอย่างคุณจะสร้างกฎ ดังนั้นในขณะที่การออกแบบ API หรือโครงการของคุณถ้ากฎของคุณรวมถึง "ถ้ามีคนเปิดทุกรหัสแหล่งที่มาเหล่านี้ด้วย notepad เขาหรือเธอควรจะยิงเขา / เธอในหัว" แล้วคุณมีทั้งหมดปรับไม่ที่จะทำนี้


คำตอบที่ดี @Jai
— gaurav

เหตุผลแรกในการถ่ายคือการเขียนคลาสที่มีโค้ด 10kหลายบรรทัดโดยเฉพาะอย่างยิ่งถ้าโค้ดถูกแบ่งออกเป็นคลาสอื่น ๆ ซึ่งไม่จำเป็นต้องซ้อนกัน :)
— LuCio

@LuCio Lol จริง xD
— ใจ

7

ยกเว้นว่าคุณมีชื่อตัวแปรที่ทับซ้อนกันจริงๆแล้วมันก็เพื่อความชัดเจนเมื่อคุณอ่านรหัส


1
เมื่อคุณเห็นthisคำหลักอย่างต่อเนื่องเมื่อไม่จำเป็นก็เป็นเพียงรหัสสำเร็จรูปทำให้รหัสอ่านยากขึ้น
— AxeEffect

ฉันเพิ่งเจอโครงการโอเพนซอร์สที่ต้องการให้สมาชิกทุกคนนำหน้าด้วย 'สิ่งนี้' นอกเหนือจากนั้นโครงการนี้เขียนขึ้นเป็นอย่างดี แต่ฉันก็อยากจะเข้าร่วมการถกเถียงทางศาสนากับพวกเขา
— LegendLength

4
@AxeEffect ฉันรู้ว่านี่เก่าจริง ๆ แต่ ... thisอย่าทำให้รหัสอ่าน lmao ยากขึ้น
— Xatenev

4

@William Brendel ให้สามกรณีการใช้งานที่แตกต่างกันในวิธีที่ดี

ใช้กรณีที่ 1:

หน้าเอกสาร Java อย่างเป็นทางการเกี่ยวกับเรื่องนี้ให้ใช้กรณีเดียวกัน

ภายในเมธอดอินสแตนซ์หรือตัวสร้างนี่เป็นการอ้างอิงไปยังวัตถุปัจจุบัน - วัตถุที่มีเมธอดหรือตัวสร้างกำลังถูกเรียก คุณสามารถอ้างถึงสมาชิกใด ๆ ของวัตถุปัจจุบันจากภายในวิธีการอินสแตนซ์หรือตัวสร้างโดยใช้สิ่งนี้

ครอบคลุมสองตัวอย่าง:

การใช้สิ่งนี้กับฟิลด์และการใช้สิ่งนี้กับคอนสตรัคเตอร์

ใช้กรณีที่ 2:

กรณีการใช้งานอื่น ๆ ที่ไม่ได้อ้างอิงในโพสต์นี้: thisสามารถใช้เพื่อซิงโครไนซ์วัตถุปัจจุบันในแอพพลิเคชั่นแบบมัลติเธรดเพื่อป้องกันส่วนสำคัญของข้อมูลและวิธีการ

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

ใช้กรณีที่ 3:

การนำไปใช้ของรูปแบบตัวสร้างขึ้นอยู่กับการใช้thisเพื่อส่งคืนวัตถุที่ถูกปรับเปลี่ยน

อ้างถึงโพสต์นี้

การรักษาผู้สร้างในคลาสที่แยกต่างหาก (ส่วนต่อประสานที่คล่องแคล่ว)


2

Google เปิดหน้าในเว็บไซต์ Sun ที่กล่าวถึงนี้เล็กน้อย

คุณพูดถูกเกี่ยวกับตัวแปร thisสามารถนำมาใช้เพื่อแยกความแตกต่างของตัวแปรวิธีจากสนามชั้น

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

แต่ผมจริงๆเกลียดการประชุมว่า การให้ชื่อสองตัวแปรที่เหมือนกันอย่างแท้จริงนั้นเป็นสูตรสำหรับข้อบกพร่อง ฉันชอบอะไรบางอย่างตามสายของ:

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

ผลลัพธ์เดียวกัน แต่ไม่มีโอกาสที่จะเกิดข้อผิดพลาดที่คุณอ้างถึงโดยไม่ตั้งใจxเมื่อคุณตั้งใจจะอ้างถึงxแทน

ในการใช้งานด้วยวิธีการคุณมีสิทธิ์เกี่ยวกับผลกระทบ คุณจะได้ผลลัพธ์เดียวกันโดยมีหรือไม่มี คุณสามารถใช้มันได้หรือไม่ แน่ใจ คุณควรใช้มันหรือไม่? แล้วแต่คุณ แต่โดยส่วนตัวแล้วฉันคิดว่ามันเป็นคำฟุ่มเฟื่อยมากที่ไม่เพิ่มความชัดเจนใด ๆ (ยกเว้นว่ารหัสถูกอัดแน่นเต็มไปด้วยคำสั่งการนำเข้าแบบสแตติก) ฉันไม่อยากใช้มันเอง


4
มันไม่ใช่แบบแผนมันเป็นกลไกการกำหนดขอบเขตภาษาโปรแกรม สิ่งที่คุณแสดงไว้ - การใช้ newX (ฉันชอบ pX สำหรับพารามิเตอร์ x) เป็นแบบแผน
— Bill K

@ บิล K: ฉันไม่เข้าใจความแตกต่างที่คุณทำ ฉันสามารถเลือกตั้งชื่อตัวแปรอินพุต x หรือ newX หรือ pX หรือ mangroveThroatWarblerX การเลือกที่จะตั้งชื่อให้เหมือนกับตัวแปรนั้นคือการตั้งค่าไม่ใช่แบบแผนในขณะที่เตรียม "new" หรือ "p" หรือ "Gratuitous Monty Python Reference" เป็นการเตรียมการ?
— BlairHippo

3
"Gratuitoud Monty Python References" ไม่ใช่แบบแผนมันเป็นกฎหมาย
— อดัมโรบินสัน

+1: เราใช้มาตรฐานการตั้งชื่อที่แตกต่างกันสำหรับอาร์กิวเมนต์และตัวแปรเมธอดกว่าสำหรับตัวแปรคลาสด้วยเหตุผลนี้ เราย่อตัวโต้แย้ง / method vars และใช้คำแบบเต็มสำหรับตัวแปร class / instance
— Lawrence Dol

1
การแก้ปัญหาโดยใช้หลักการตั้งชื่อคือ hmm การประชุม การแก้ปัญหาโดยใช้คุณสมบัติภาษา - ฉันเดาว่าการเลือกที่จะไม่ใช้คุณสมบัติภาษานั้นหรือใช้มันเป็นแบบแผน ... การใช้สิ่งนี้ ทุกครั้งที่คุณเข้าถึงสมาชิกจะเป็นแบบแผน คิดว่ามันไม่สำคัญหรอกฉันก็เกลียดเช่นกัน
— Bill K

2

ต่อไปนี้เป็นวิธีการใช้คำสำคัญ 'this' ใน java:

  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

จะมีความแตกต่างหรือไม่ถ้าฉันใช้ "x" แทน "this.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
     }
  }

หากฉันเพิ่งใช้ "method ()" จะไม่ใช้กับวัตถุปัจจุบันตามค่าเริ่มต้นหรือไม่

ใช่. แต่ถ้าจำเป็นให้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โพสต์และ 's 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

คีย์เวิร์ด“ This” ใน java ใช้เพื่ออ้างอิงคลาสอ็อบเจ็กต์ปัจจุบัน

คีย์เวิร์ด“ this” ในจาวามีประโยชน์ 6 ข้อ

  1. การเข้าถึงตัวแปรระดับชั้นเรียนส่วนใหญ่จะใช้หากตัวแปรระดับท้องถิ่นและระดับเดียวกัน
  2. การเข้าถึงวิธีการเรียน : นี่คือพฤติกรรมเริ่มต้นและสามารถละเว้น
  3. สำหรับการเรียกคอนสตรัคเตอร์อื่นของคลาสเดียวกัน
  4. การใช้คำหลัก 'this' เป็นค่าตอบแทน : สำหรับส่งคืนอินสแตนซ์ปัจจุบันจากวิธีการ
  5. การส่งคีย์เวิร์ด 'this' เป็นอาร์กิวเมนต์ไปยังเมธอด Passing: สำหรับการผ่านอินสแตนซ์ของคลาสปัจจุบันเป็นอาร์กิวเมนต์
  6. คำหลักนี้เป็นข้อโต้แย้งให้กับคอนสตรัค : สำหรับการส่งอินสแตนซ์ของคลาสปัจจุบันเป็นอาร์กิวเมนต์

ref: https://stacktraceguru.com/java/this-keyword-in-java


-8

เพื่อให้แน่ใจว่ามีการใช้สมาชิกของวัตถุปัจจุบัน กรณีที่กังวลเรื่องความปลอดภัยของเธรดบางแอ็พพลิเคชันอาจเปลี่ยนค่าสมาชิกออบเจ็กต์ที่ไม่ถูกต้องด้วยเหตุนี้จึงควรนำไปใช้กับสมาชิกเพื่อให้ใช้ค่าสมาชิกออบเจ็กต์ที่ถูกต้อง

หากวัตถุของคุณไม่เกี่ยวข้องกับความปลอดภัยของเธรดดังนั้นจึงไม่มีเหตุผลที่จะระบุว่าจะใช้ค่าของสมาชิกวัตถุใด


นี่ไม่ใช่กรณี ฉันไม่แน่ใจด้วยซ้ำว่าคุณกำลังคิดอะไร แต่ตัวอย่างอาจมีประโยชน์ที่จะเข้าใจสิ่งที่คุณกำลังพูด
— David Berger

1
ใช่. ฉันรู้ว่าสิ่งที่คุณกำลังอธิบายเกี่ยวข้องกับความปลอดภัยของเธรด ไม่มีคำตอบที่ถูกต้องสำหรับคำถามนี้ที่เกี่ยวข้องกับความปลอดภัยของเธรด หาก "นี่" จำเป็นต้องอ้างถึงวัตถุที่ถูกต้องจากนั้นเมื่อทำเช่นนั้นแล้ววิธีการหรือแอตทริบิวต์จะเป็นเธรดที่ปลอดภัยถ้าหากว่ามีการซิงโครไนซ์ หากการอ้างอิงเป็นที่คลุมเครือมันจะคลุมเครือหรือไม่ว่าการมัลติเธรดเป็นปัญหา
— เดวิดเบอร์เกอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.