Słowo this
kluczowe jest używane przede wszystkim w trzech sytuacjach. Pierwszą i najczęstszą jest metoda ustawiania w celu ujednoznacznienia odniesień zmiennych. Drugim jest, gdy istnieje potrzeba przekazania bieżącej instancji klasy jako argumentu do metody innego obiektu. Trzeci to sposób na wywołanie alternatywnych konstruktorów z poziomu konstruktora.
Przypadek 1: Użycie this
do ujednoznacznienia odniesień zmiennych. W metodach ustawiających Java zwykle przekazujemy argument o tej samej nazwie co zmienna prywatnego członka, którą próbujemy ustawić. Następnie przypisujemy argument x
do this.x
. To wyjaśnia, że przypisujesz wartość parametru „name” do zmiennej instancji „name”.
public class Foo
{
private String name;
public void setName(String name) {
this.name = name;
}
}
Przypadek 2: Użycie this
jako argumentu przekazanego do innego obiektu.
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();
}
}
Przypadek 3: Używanie this
do wywoływania alternatywnych konstruktorów. W komentarzach Trinithis poprawnie wskazał na inne powszechne zastosowanie this
. Jeśli masz wiele konstruktorów dla jednej klasy, możesz użyć this(arg0, arg1, ...)
wywołania innego wybranego konstruktora, pod warunkiem, że zrobisz to w pierwszym wierszu swojego konstruktora.
class Foo
{
public Foo() {
this("Some default value for bar");
//optional other lines
}
public Foo(String bar) {
// Do something with bar
}
}
Zauważyłem również this
, że podkreślałem fakt, że odwołuje się do zmiennej instancji (bez potrzeby ujednoznacznienia), ale moim zdaniem jest to rzadki przypadek.
this(arg1, arg2, ...)
wewnątrz konstruktora.this
którym zapomniałem, więc dodałem je do mojej odpowiedzi. Nie widzę w tym nic złego, ponieważ wynik końcowy jest lepszą odpowiedzią, co jest dokładnie celem SO. Staram się również dawać uznanie tam, gdzie to możliwe, tak jak w przypadku Trinithis.this
jest używany tylko wtedy, gdy naprawdę konieczne jest ujednoznacznienie, jak w moim poprzednim przykładzie. Style kodowania i „najlepsze praktyki” mogą się znacznie różnić w zależności od tego, kogo zapytasz, ale ogólnie rzecz biorąc, zalecam wybór rozsądnych wzorów i trzymanie się ich. Spójność, nawet tylko wewnętrznie w ramach jednej bazy kodu, znacznie przyczynia się do czytelności i konserwacji.Drugim ważnym zastosowaniem
this
(oprócz ukrywania za pomocą zmiennej lokalnej, jak już wiele odpowiedzi już mówi) jest dostęp do zewnętrznej instancji z zagnieżdżonej klasy niestatycznej:źródło
Musisz użyć
this
- i większość ludzi korzysta z niego - tylko wtedy, gdy zachodzi na siebie zmienna lokalna o tej samej nazwie. (Na przykład metody Settera.)Oczywiście innym dobrym powodem do użycia
this
jest to, że powoduje wyskakiwanie inteligencji w IDE :)źródło
Jedynym potrzeba użyć
this.
kwalifikator jest, gdy inny zmienna w obecnych udziałów zakres tej samej nazwie i chcesz zapoznać się z członka instancji (podobnie jak William opisuje). Poza tym nie ma różnicy w zachowaniu międzyx
ithis.x
.źródło
this.x
aby twój kod był czytany nieco jaśniej, łatwość konserwacji / czytelność kodu jest również czynnikiem, który powinieneś wziąć pod uwagę ...„to” jest również przydatne, gdy wywołuje się jednego konstruktora od drugiego:
źródło
this
jest użyteczny we wzorze konstruktora.źródło
Istnieje wiele dobrych odpowiedzi, ale istnieje jeszcze jeden bardzo niewielki powód, aby umieścić
this
wszędzie. Jeśli próbujesz otworzyć kody źródłowe z normalnego edytora tekstu (np. Notatnika itp.), Użyciethis
sprawi, że czytanie będzie znacznie łatwiejsze.Wyobraź to sobie:
Jest to bardzo jasne do odczytania za pomocą dowolnego nowoczesnego IDE, ale będzie to całkowity koszmar do przeczytania za pomocą zwykłego edytora tekstu.
Będziesz się starał dowiedzieć się, gdzie
foo
mieszka, dopóki nie użyjesz funkcji „znajdź” edytora. Wtedy będziesz krzyczećgetStringFromSomewhere()
z tego samego powodu. Wreszcie, kiedy zapomnisz, cos
jest,bar = s
da ci to ostateczny cios.Porównaj to z tym:
foo
jest to zmienna zadeklarowana w klasie zewnętrznejHello
.getStringFromSomewhere()
jest to metoda zadeklarowana również w klasie zewnętrznej.bar
należy doWorld
klasy is
jest lokalną zmienną zadeklarowaną w tej metodzie.Oczywiście za każdym razem, gdy coś projektujesz, tworzysz reguły. Jeśli więc projektujesz interfejs API lub projekt, jeśli Twoje zasady obejmują: „jeśli ktoś otworzy wszystkie te kody źródłowe za pomocą notatnika, powinien postrzelić się w głowę”, to jest całkowicie w porządku, aby tego nie robić .
źródło
Chyba, że masz nakładające się nazwy zmiennych, to naprawdę tylko dla przejrzystości podczas czytania kodu.
źródło
this
słowo kluczowe, gdy nie jest to konieczne, jest to po prostu kod, który utrudnia odczytanie kodu.this
NIE sprawia, że kod trudniej odczytać lmao.@William Brendel w odpowiedzi podał trzy różne przypadki użycia w przyjemny sposób.
Przypadek użycia 1:
Oficjalna strona dokumentacji Java na tej stronie zawiera te same przypadki użycia.
Obejmuje dwa przykłady:
Używanie tego z polem i Używanie tego z konstruktorem
Przypadek użycia 2:
Inny przypadek użycia, który nie został zacytowany w tym poście:
this
można go użyć do synchronizacji bieżącego obiektu w aplikacji wielowątkowej w celu ochrony krytycznej sekcji danych i metod.Przypadek użycia 3:
Implementacja wzorca Konstruktora zależy od użycia
this
do zwrócenia zmodyfikowanego obiektu.Zobacz ten post
Utrzymywanie konstruktora w osobnej klasie (płynny interfejs)
źródło
Google wyświetliło stronę w witrynie Sun, która nieco to omawia.
Masz rację co do zmiennej;
this
można rzeczywiście zastosować do odróżnienia zmiennej metody od pola klasy.Jednak naprawdę nie znoszę tej konwencji. Podanie dwóch różnych zmiennych dosłownie identycznych nazw to przepis na błędy. Wolę coś w stylu:
Te same wyniki, ale bez szansy na błąd, do którego przypadkowo się odwołujesz,
x
kiedy tak naprawdę chciałeś to zrobićx
.Jeśli chodzi o korzystanie z metody, masz rację co do efektów; uzyskasz takie same wyniki z nim lub bez niego. Czy możesz tego użyć? Pewnie. Czy powinieneś go użyć? Od ciebie, ale biorąc pod uwagę, że osobiście uważam, że to bezcelowa gadatliwość nie dodaje żadnej przejrzystości (chyba że kod jest wypełniony statycznymi instrukcjami importu), nie jestem skłonny do używania go sam.
źródło
Oto sposoby używania tego słowa kluczowego w java:
this
słowa kluczowego do odwołania do bieżących zmiennych instancji klasythis()
do wywołania bieżącego konstruktora klasythis
słowa kluczowego do zwrócenia bieżącej instancji klasythis
słowa kluczowego jako parametru metodyhttps://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
źródło
gdy są dwie zmienne, jedna zmienna instancji i inna zmienna lokalna o tej samej nazwie, wówczas używamy tej. odsyłanie do bieżącego obiektu wykonującego, aby uniknąć konfliktu między nazwami.
źródło
this
jest odniesieniem do bieżącego obiektu. Jest używany w konstruktorze do rozróżnienia lokalnej i bieżącej zmiennej klasy o tej samej nazwie. na przykład:this
można również użyć do wywołania jednego konstruktora z innego konstruktora. na przykład:źródło
Czy będzie jakaś różnica, jeśli użyję „x” zamiast „this.x” w niektórych metodach?
Zwykle nie. Ale czasami robi to różnicę:
Jeśli po prostu użyję metody „method ()”, czy domyślnie nie zostanie zastosowana do bieżącego obiektu?
Tak. Ale w razie potrzeby
this.method()
wyjaśnia, że wywołanie jest wykonywane przez ten obiekt.źródło
this
nie wpływa na wynikowy kod - jest operatorem czasu kompilacji, a kod wygenerowany z nim lub bez będzie taki sam. Kiedy musisz go użyć, zależy od kontekstu. Na przykład musisz go użyć, jak powiedziałeś, kiedy masz zmienną lokalną, która zaciemnia zmienną klasy i chcesz odwoływać się do zmiennej klasy, a nie lokalnej.edit: przez „wynikowy kod będzie taki sam” Mam na myśli oczywiście, że jakaś zmienna w zasięgu lokalnym nie ukrywa zmiennej należącej do klasy. A zatem
wynikowy kod obu metod będzie taki sam. Różnica polega na tym, że jakaś metoda deklaruje zmienną lokalną o tej samej nazwie
źródło
W odniesieniu do postów Williama Brendela i pytania dbconfessions dotyczących przypadku 2 . Oto przykład:
Widziałem to używane podczas budowania relacji rodzic-dziecko z obiektami. Należy jednak pamiętać, że jest to uproszczone ze względu na zwięzłość.
źródło
„To” słowo kluczowe w java służy do odwoływania się do bieżących obiektów klasy.
Istnieje 6 zastosowań słowa kluczowego „this” w java
ref: https://stacktraceguru.com/java/this-keyword-in-java
źródło
Aby upewnić się, że używane są elementy bieżącego obiektu. W przypadkach, w których bezpieczeństwo wątków stanowi problem, niektóre aplikacje mogą zmieniać niepoprawne wartości elementów składowych, dlatego należy to zastosować do elementu, aby użyć prawidłowej wartości elementu składowego.
Jeśli twój obiekt nie zajmuje się bezpieczeństwem wątków, nie ma powodu, aby określać, która wartość elementu obiektu jest używana.
źródło