2013-04-05 12 views
19

Giáo viên của tôi nói rằng khi tôi cố gắng truy cập một biến mẫu trong một phương pháp, tôi luôn sử dụng từ khóa this, nếu không tôi sẽ thực hiện tìm kiếm kép. Tìm kiếm phạm vi cục bộ và sau đó tìm kiếm phạm vi mẫu.Tôi có nên sử dụng từ khóa "này" khi tôi muốn tham chiếu đến các biến mẫu trong một phương thức không?

Ví dụ:

public class Test(){ 
    int cont=0; 
    public void Method(){ 
     System.out.println(cont);//Should I use This.cont instead? 
    } 
} 

Tôi hy vọng anh ấy là sai, nhưng tôi không thể tìm thấy bất kỳ cuộc tranh cãi.

+0

@LuiggiMendoza: ok làm –

+11

* "Double tìm kiếm *" ??? Giáo viên của bạn có nhận ra rằng tra cứu tên được thực hiện tại thời gian biên dịch không? – Pubby

+2

@HovercraftFullOfEels Tại sao bạn nói _only_ sử dụng nó sau đó? (Hoặc bạn có nghĩa là bạn chỉ _need_ để sử dụng nó sau đó?) – cheeken

Trả lời

30

Không, chỉ sử dụng this khi bạn có xung đột tên, chẳng hạn như khi tham số phương thức có cùng tên với trường thể hiện được đặt.

Nó có thể được sử dụng vào các thời điểm khác, nhưng nhiều người trong chúng ta cảm thấy rằng nó chỉ đơn giản là thêm vào việc sử dụng mã không cần thiết đối với mã.

+4

Loại mã này có khả năng đọc kém. Luôn sử dụng 'this'. Nếu không, mọi người đọc sẽ thấy một tham chiếu đến một biến mà họ tự hỏi liệu đó là một biến cục bộ hay một biến cá thể. – MohamedEzz

+2

@MohamedEzz: chúng tôi đồng ý không đồng ý, nhưng tôi tôn trọng ý kiến ​​của bạn, và hoàn toàn ổn với cuộc bỏ phiếu của bạn vì nó đã được thực hiện cho những gì bạn tin là một lý do hợp lệ và bình luận của bạn về nó. Trân trọng, cảm ơn bạn đã bình luận. –

+0

Tôi đang sử dụng Hovercraft - trước tiên, nếu bạn viết mã gọn gàng, được cấu trúc tốt và gắn kết, cần phải rõ ràng với bất kỳ lập trình viên có thẩm quyền nào mà một biến là thành viên. Thứ hai, IDE làm cho việc xác định các biến thành viên tầm thường vì mã hóa màu. – ayahuasca

0

this chỉ áp dụng cho trường hợp thông số có cùng tên với thuộc tính lớp.

public class Dog { 
    String name; 
    public Dog(String name) { 
     name = name; //but which name? Are we just assigning a variable to itself? 
     // here you could say this.name = name. Or you could rename one of the variables to resolve ambiguity 
    } 
} 
0

Tôi thỉnh thoảng sử dụng this vì autocompletion (làm cho cuộc sống dễ dàng hơn), nhưng tôi sạch chúng sau đó.

Hãy nhớ rằng, sự rõ ràng là chìa khóa. Trong trường hợp này, rõ ràng là cont là một biến lớp, nhưng nếu bạn đang viết một lớp rất lớn với các đống biến mẫu, bạn có thể xem xét sử dụng this để rõ ràng.

Bạn cũng chỉ cần cần để sử dụng this khi có xung đột tên, ví dụ:

public class Ex { 
    int num; 
    public Ex(int num) { 
     this.num = num; 
    } 
} 

Trong ví dụ này, trong khi num = num sẽ gây ra xung đột, "điều này" tránh được. Đây là lần duy nhất nó là hoàn toàn cần thiết, nhưng một lần nữa, thường rõ ràng là một ưu tiên cao hơn.

+1

Tôi không chắc chắn bạn sử dụng IDE nào, nhưng tôi biết rằng với Eclipse, không cần sử dụng 'this' khi tự động hoàn thành vì không gian ctrl sẽ tự động hoàn thành mà không có' this'. –

+0

@ HovercraftFullOfEels Hmm, tôi chưa bao giờ thực sự nhìn vào điều đó. Tôi đang sử dụng NetBeans; không chắc chắn phím tắt là gì. Tôi sẽ phải nhìn vào đó! – Zyerah

2

this là bí danh hoặc tên cho cá thể hiện tại bên trong cá thể. Nó rất hữu ích cho việc định hướng các biến cá thể từ người dân địa phương (bao gồm các tham số), nhưng nó có thể được sử dụng một cách đơn giản để chỉ các biến và phương thức của thành viên, gọi các quá trình xây dựng khác hoặc chỉ đơn giản là tham chiếu đến cá thể đó.
Xem Java - when to use 'this' keyword
Đồng thời Điều này cũng đề cập đến đối tượng hiện tại. Nếu bạn có lớp với các biến int A và một phần xyz của lớp có int A, chỉ để phân biệt 'A' nào bạn đang giới thiệu, bạn sẽ sử dụng this.A. Đây chỉ là một ví dụ.

public class Test 
{ 
int a; 

public void testMethod(int a) 
{ 
this.a = a; 
//Here this.a is variable 'a' of this instance. parameter 'a' is parameter. 
} 
} 

Vì vậy, bạn có thể nói rằng
từ khóa này có thể được sử dụng cho (Nó không thể được sử dụng với các phương pháp tĩnh):

 1)To get reference of an object through which that method is 
     called within it(instance method). 
     2)To avoid field shadowed by a method or constructor parameter. 
     3)To invoke constructor of same class. 
     4)In case of method overridden, this is used to invoke method of current class. 
     5)To make reference to an inner class. e.g ClassName.this 
+0

Bạn có thể tạo một ví dụ trên 4) Trong trường hợp phương thức bị ghi đè, điều này được sử dụng để gọi phương thức của lớp hiện tại. Đã cố gắng thử nghiệm nhưng không thể phát hiện tình huống hợp lệ. – brnfd

+0

chia sẻ mã của bạn dưới dạng câu hỏi, có thể bạn sẽ nhận được câu trả lời – Freak

19

Bạn phải sử dụng this nếu được yêu cầu vì có mâu thuẫn tên , mặc dù tốt hơn hết là tránh những thứ đó hoàn toàn.

Bạn có thể sử dụng this nếu bạn muốn. Nó hoàn toàn là một vấn đề của hương vị.

Bạn nên sử dụng this trong bài tập ở trường nếu giáo viên của bạn yêu cầu.

+2

+1 để gợi ý điểm lớn hơn: mọi môi trường bạn làm việc sẽ có quy ước mã hóa và bạn nên theo dõi chúng ngay cả khi bạn không thích chúng. mã nhất quán dễ dàng hơn trên mắt. Nếu quy ước của giáo viên là luôn luôn sử dụng 'điều này', vì vậy hãy là nó. (Nhưng không có tìm kiếm kép nào đang diễn ra.) – yshavit

+0

@yshavit Tôi nghĩ đó không phải là về quy ước ở đây. Đó là về lý do (sai) mà giáo viên đang đưa ra. Nếu nó có liên quan gì đến quy ước của giáo viên, họ sẽ đề cập đến điều đó, hoặc sẽ không nói gì cả. Giáo viên chỉ đơn giản là nhầm lẫn. Họ có thể cảm ơn học sinh đã sửa chữa chúng. – Solace

1

Kể từ khi tất cả mọi người đã đưa ra ví dụ về tên disambiguating, tôi sẽ đưa ra một ví dụ khi sử dụng this giúp đỡ:

public class Person { 
    private final firstName; 
    private final lastName; 
    private final Date birthdate; 
    private final Address address; 

    @Override 
    public boolean equals(Object otherObject) { 
     if (!(otherObject instanceof Person) { 
      return false; 
     } 

     Person otherPerson = (Person) otherObject; 

     // Using this here help distinguishing the current instance and the other. 
     return this.firstName.equals(otherPerson.firstName) 
      && this.lastName.equals(otherPerson.lastName) 
      && this.birthdate.equals(otherPerson.birthDate) 
      && this.address.equals(otherPerson.address); 
    } 

} 
2

Giáo viên của bạn là chính xác rằng nó sẽ gây ra tìm kiếm đôi cho trình biên dịch nếu bạn không sử dụng trong số this từ khóa. Đầu tiên trình biên dịch sẽ tìm kiếm ở phạm vi cục bộ và sau đó phạm vi cá thể nếu trình biên dịch không thể tìm thấy biến tại phạm vi cục bộ.

Ngoài ra, trong khi trình biên dịch chuyển mã của bạn sang bytecode, trình biên dịch sẽ thêm tiền tố cho tất cả các biến mẫu với từ khóa this. Vì vậy, nếu bạn tự mình sử dụng từ khóa this, bạn thực sự đang giảm gánh nặng cho trình biên dịch và mã sẽ được biên dịch nhanh hơn.

+4

Tôi sẽ không cảm thấy tiếc cho trình biên dịch. Ý tôi là, tôi cũng làm cho nó thoát ra ý kiến ​​của tôi! –

+1

Tôi đồng ý với bạn. Nó chỉ là một sở thích cá nhân. Một điều nữa là nếu mã đi quá lâu, thì nó cũng sẽ làm tăng tính dễ hiểu của mã cho người mới hiểu rằng bạn đang sử dụng một biến cá thể chứ không phải biến cục bộ. – user1190882

0

Một địa điểm khác mà this thường được sử dụng để dễ đọc là khi đối tượng lớp bên trong đề cập đến trường của đối tượng chứa của nó.

public class Foo { 

    String foostring; 
    /* snip lots of code */ 
    private class Foohelper { 
     void helperMethod(String bazstring) { 
      Foo.this.foostring = bazstring; 
      // etc. 
     } 
    } 
} 

Trình biên dịch không cần điều này, nhưng nó làm cho tình huống tìm kiếm foostring rõ ràng hơn. Khác với này (!), Tôi chỉ hoàn toàn đủ điều kiện tên trường trong constructor nơi chúng có thể được ẩn bởi tên tham số, như nhiều áp phích khác đã minh họa ở đây.

[Edit:. Bây giờ tôi nghĩ về nó, có những nơi trình biên dịch cần này, ví dụ, nếu Foohelper.toString() muốn gọi Foo.toString()]

Các vấn đề liên quan