Có rất nhiều câu trả lời hay, nhưng có một lý do rất nhỏ khác để đưa ra this
khắp nơi. Nếu bạn đã thử mở mã nguồn từ trình soạn thảo văn bản thông thường (ví dụ: notepad, v.v.), việc sử dụng this
sẽ giúp việc đọc trở nên rõ ràng hơn rất nhiều.
Hãy tưởng tượng điều này:
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;
}
}
}
Điều này rất rõ ràng để đọc với bất kỳ IDE hiện đại nào, nhưng đây sẽ là một cơn ác mộng hoàn toàn khi đọc với một trình soạn thảo văn bản thông thường.
Bạn sẽ đấu tranh để tìm ra nơi foo
cư trú, cho đến khi bạn sử dụng chức năng "tìm" của trình soạn thảo. Sau đó, bạn sẽ hét lên getStringFromSomewhere()
với lý do tương tự. Cuối cùng, sau khi bạn quên mất những gì s
, điều đó bar = s
sẽ cho bạn cú đánh cuối cùng.
So sánh nó với điều này:
public void doSomething() {
// More codes
Hello.this.foo = "FOO";
// More codes
String s = Hello.this.getStringFromSomewhere();
// More codes
this.bar = s;
}
- Bạn biết
foo
là một biến được khai báo trong lớp bên ngoài Hello
.
- Bạn biết
getStringFromSomewhere()
là một phương thức được khai báo trong lớp bên ngoài là tốt.
- Bạn biết rằng nó
bar
thuộc về World
lớp và s
là một biến cục bộ được khai báo trong phương thức đó.
Tất nhiên, bất cứ khi nào bạn thiết kế một cái gì đó, bạn tạo ra các quy tắc. Vì vậy, trong khi thiết kế API hoặc dự án của bạn, nếu quy tắc của bạn bao gồm "nếu ai đó mở tất cả các mã nguồn này bằng notepad, anh ấy hoặc cô ấy sẽ tự bắn vào đầu mình", thì bạn hoàn toàn không nên làm điều này .