2011-07-01 65 views

Trả lời

58

Thời gian duy nhất quan trọng là nếu bạn đang sử dụng OuterClass.this.method() ví dụ:

class OuterClass { 
    void method() { } 

    class InnerClass { 
     void method() { 
      OuterClass.this.method(); // not the same as method(). 
     } 
    } 
} 
+1

mặc dù, nó giống như OuterClass.method() trong trường hợp phương thức là static –

+3

Nói đúng, IMHO bạn không thể so sánh OuterClass.this.method() với phương thức() vì chúng ta chỉ so sánh việc bỏ hoặc đặt "this". vào/ra. –

+1

Cảm ơn bạn đã đưa ra ví dụ đặc biệt này, Peter. –

27

Hoàn toàn không có sự khác biệt giữa các cấu trúc này và bytecode được tạo sẽ giống hệt nhau, do đó không có tác động hiệu suất. this được giải quyết trong quá trình biên soạn nếu không được xác định rõ ràng.

Lý do duy nhất để sử dụng rõ ràng this là khả năng đọc - một số người thấy dễ đọc hơn vì this gợi ý rằng đây là phương pháp thể hiện của đối tượng hiện tại.

Cũng xin lưu ý rằng nếu method() là tĩnh, sử dụng this không được khuyến khích và gây hiểu lầm.

private static void method() { 
} 

private void foo() { 
    this.method(); //generates warning in my IDE for a reason 
} 

Và trong trường hợp này nó cũng sẽ không ảnh hưởng đến hiệu suất.

+1

Nếu phương pháp là tĩnh thì không chính xác. Trình biên dịch của tôi sẽ cho tôi biết rằng không có con trỏ "này" cho một phương thức tĩnh. – duffymo

+0

@duffymo: Tôi đã làm rõ ý nghĩa của phương pháp 'tĩnh'. –

+0

Cảm ơn bạn, Tomasz. Không có phiếu bầu nào từ tôi; làm rõ của bạn là hoàn hảo. – duffymo

2

Không có sự khác biệt thực sự - Ít nhất không có tác động hiệu suất. Tôi không thích viết "cái này" - IDE thường có thể làm nổi bật các cuộc gọi đến điều này, và tôi nghĩ nó ít dễ đọc hơn khi mọi truy cập vào các phương thức/trường/... bắt đầu với "cái này". Nhưng nó thực sự là một vấn đề sở thích cá nhân.

1

Sử dụng this.method() làm rõ rằng hàm được liên kết với cá thể của lớp đang được gọi, trái ngược với hàm tĩnh hoặc thuộc một đối tượng khác.

Đó là tinh thần của những nhà phát triển C++ muốn thêm "m_" vào tất cả các biến thành viên trong một lớp. Nó làm cho quyền sở hữu rõ ràng. Tôi có xu hướng thích nó, nhưng nó không quan trọng khi bạn đang sử dụng một IDE làm rõ những điều như vậy bằng cách sử dụng màu sắc và phông chữ.

+0

"* một thuộc về một đối tượng khác *" Vâng, nó nhất thiết phải được tiền tố bởi đối tượng khác, phải không? "* như trái ngược với một hàm tĩnh *" Sự khác biệt có quan trọng không? – PhiLho

5

Đối với phương pháp không có sự khác biệt, nhưng nó có thể tạo sự khác biệt với các trường. Hãy xem xét mã này:

private String someObject = "some value"; 

public String someMethod(String someObject) { 
    //this.someObject refers to the field while 
    //someObject refers to the parameter 
} 
18

Điều đó không có sự khác biệt có thể thấy bằng cách gọi javap -c ClassName trên dòng lệnh. Ví dụ:

public class This { 
    private void method() { 
    } 
    public void noThis() { 
     method(); 
    } 
    public void useThis() { 
     this.method(); 
    } 
} 

Tạo đầu ra tháo rời sau:

Compiled from "This.java" 
public class This extends java.lang.Object{ 
public This(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public void noThis(); 
    Code: 
    0: aload_0 
    1: invokespecial #2; //Method method:()V 
    4: return 

public void useThis(); 
    Code: 
    0: aload_0 
    1: invokespecial #2; //Method method:()V 
    4: return 

} 
+0

Sự khác biệt duy nhất có lẽ là vài phần nghìn giây tại thời gian biên dịch khi nó tìm ra 'điều này 'tiềm ẩn. – TWiStErRob

2

Không có sự khác biệt ở tất cả ngoại trừ khả năng đọc. Nó làm cho nó rõ ràng hơn cho người đọc.

+1

Khả năng đọc nằm trong con mắt của đối tượng: Tôi thấy nó ồn hơn vì thông tin của 'this' là thừa, vì nó là ẩn. Nó có thể giúp người mới, nó gây phiền nhiễu cho (hầu hết) các lập trình viên có kinh nghiệm hơn. – PhiLho

-2

Bạn đã cố gắng thực hiện điều này. Có thể biến đổi trong hàm tạo không?

Về lý thuyết, trong C++, vì đối tượng chưa được tạo nên không có điều này. Tôi không chắc chắn về trường hợp trong Java.

+0

Hoạt động trong Java vì 'this.foo = foo;' là một mẫu rất phổ biến để bắt đầu các trường (biến thành viên) từ các tham số cùng tên. – PhiLho

2

Sử dụng và/hoặc this.myVar hoặc các phương pháp không có trên đó không có sự khác biệt, về vars có thể có - nhưng nhất quán về nó. Tôi thấy nó rải khắp mã, đôi khi tôi thậm chí còn thấy this.m_myClassVar.

Cá nhân tôi thích tiền tố lớp học của tôi vars với một dấu gạch dưới đơn giản và đặt một dấu gạch chân trên args phương pháp của tôi:

public MyClass 
{ 
    private int _myInt; 

    public void myMethod(final int myInt_, final int fooFactor_) 
    { 
     _myInt = myInt_ * fooFactor_; 
    } 
} 

Mặc dù hầu hết các IDEs sẽ làm cho nó rõ ràng là đó, tôi tìm thấy điều này có xu hướng để ngăn chặn sai lệch và làm cho ý định của mã rõ ràng hơn và IMO dễ đọc hơn.

Tôi sử dụng _thisInstance.myMethod() (trong đó _thisInstance là tham chiếu đến lớp bên ngoài) hoặc _thisInstance._myVar, trong lớp bên trong/trình nghe/luồng/v.v. nơi tôi cần phải rõ ràng về phương pháp mà tôi đang gọi và/hoặc nơi tôi cần phải có một tham chiếu đến một thể hiện lớp.

+0

Sử dụng dấu gạch dưới trong tên biến đi ngược lại các quy ước đặt tên Java cho các biến không liên tục. –

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