回答:
this
キーワードは、主に3つの状況で使用されています。最初で最も一般的なのは、変数参照を明確にするセッターメソッドです。2つ目は、現在のクラスのインスタンスを引数として別のオブジェクトのメソッドに渡す必要がある場合です。3つ目は、コンストラクター内から代替コンストラクターを呼び出す方法です。
ケース1:this
変数参照を明確にするために使用します。Javaセッターメソッドでは、通常、設定しようとしているプライベートメンバー変数と同じ名前の引数を渡します。私たちは、引数を割り当てるx
にthis.x
。これにより、パラメーター「name」の値をインスタンス変数「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
代替コンストラクターを呼び出すために使用する。コメントで、trinithisはの別の一般的な使用法を正しく指摘しましたthis
。単一のクラスに複数のコンストラクターがある場合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
、インスタンス変数が参照されているという事実を明確にするために使用されることもありました(曖昧さをなくす必要性はありません)が、これは私の意見ではまれなケースです。
this(arg1, arg2, ...)
、コンストラクタの中にもあります。
this
私が忘れていたもう1つの一般的な使用法を指摘したので、それを私の回答に追加しました。最終的にはSOの目的である全体としてより良い答えが得られるため、これで問題はないと思います。私はまた、トリニチスの場合と同様に、可能な限りクレジットを与えるようにしています。
this
は、上記のセッターの例のように、明確化が本当に必要な場合にのみ使用されます。もちろん、コーディングスタイルと「ベストプラクティス」は、質問する相手によって大きく異なりますが、一般的には、合理的なパターンを選択して、それらに固執することをお勧めします。一貫性は、内部的には単一のコードベース内でも、読みやすさと保守性に大きく貢献します。
2つ目の重要な使用法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;
}
}
}
this
同じ名前のローカル変数が重複している場合にのみ使用する必要があり、ほとんどの人はそれを使用するだけです。(たとえば、setterメソッド)。
もちろん、使用するもう1つの理由this
は、IntellisenseがIDEでポップアップ表示されることです:)
唯一の必要性を使用するにはthis.
、現在のスコープ内の別の変数は、同じ名前を共有し、あなたは(ウィリアムが説明のように)インスタンスメンバを参照したいとき修飾子があります。それとは別に、間の行動に違いありませんx
とはthis.x
。
this.x
あなたのコードは、より明確に少し読ん作るために、コードの保守性/可読性はあなたが考慮しなければならないという要因もある...
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();
}
}
良い答えはたくさんありますが、this
どこにでも置く理由はもう1つあります。通常のテキストエディター(メモ帳など)からソースコードを開こうとした場合は、を使用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;
}
foo
外側のクラスで宣言された変数ですHello
。getStringFromSomewhere()
だけでなく、外側のクラスで宣言されたメソッドです。bar
はWorld
クラスに属しs
、そのメソッドで宣言されたローカル変数です。もちろん、何かを設計するときはいつでも、ルールを作成します。したがって、APIまたはプロジェクトの設計中に、ルールに「これらすべてのソースコードをメモ帳で開いた場合、彼または彼女は頭の中で自分を撃たなければならない」というルールが含まれている場合は、これを行わなくても大丈夫です。
変数名が重複していない限り、コードを読んでいるときにわかりやすくするためです。
this
必要のないときに常にキーワードが表示される場合は、定型コードのため、コードが読みにくくなります。
this
コードがlmaoを読みにくくすることはありません。
@William Brendelの回答は、3つの異なるユースケースを適切に提供しました。
ユースケース1:
これに関する公式のJavaドキュメントページは、同じユースケースを提供します。
インスタンスメソッドまたはコンストラクター内では、これは現在のオブジェクト(メソッドまたはコンストラクターが呼び出されているオブジェクト)への参照です。これを使用すると、インスタンスメソッドまたはコンストラクター内から現在のオブジェクトの任意のメンバーを参照できます。
2つの例を取り上げます。
これをフィールドで使用し、これをコンストラクタで使用する
ユースケース2:
この投稿で引用されていない他のユースケース:this
マルチスレッドアプリケーションで現在のオブジェクトを同期して、データとメソッドの重要なセクションを保護するために使用できます。
synchronized(this){
// Do some thing.
}
ユースケース3:
Builderパターンの実装はthis
、変更されたオブジェクトを返すためのの使用に依存します。
この投稿を参照
グーグルはこれについて少し議論するSunサイトのページをめくった。
あなたは変数について正しいです。this
実際、メソッド変数とクラスフィールドを区別するために使用できます。
private int x;
public void setX(int x) {
this.x=x;
}
しかし、私はその慣習が本当に嫌いです。2つの異なる変数に文字通り同じ名前を付けることは、バグのレシピです。私は以下に沿って何かを好みます:
private int x;
public void setX(int newX) {
x=newX;
}
同じ結果ですが、x
実際に参照するつもりであったときに誤って参照してしまうバグはありませんx
。
メソッドでそれを使用することに関しては、あなたは効果について正しいです。それがあってもなくても同じ結果が得られます。使えますか?承知しました。あなたはそれを使うべきですか?あなた次第ですが、私が個人的にそれが明確さを追加しない無意味な冗長性であると考えると(コードが静的インポートステートメントでいっぱいに詰め込まれていない限り)、私はそれを自分で使用する傾向はありません。
以下は、Javaで「this」キーワードを使用する方法です。
this
、現在のクラスのインスタンス変数を参照するためのキーワードをthis()
して現在のクラスコンストラクターを呼び出すthis
キーワードを使用して現在のクラスインスタンスを返すthis
メソッドパラメータとしてのキーワードの使用https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
this
現在のオブジェクトへの参照です。同じ名前を持つローカル変数と現在のクラス変数を区別するためにコンストラクターで使用されます。例えば:
public class circle {
int x;
circle(int x){
this.x =x;
//class variable =local variable
}
}
this
別のコンストラクターから1つのコンストラクターを呼び出すためにも使用できます。例えば:
public class circle {
int x;
circle() {
this(1);
}
circle(int x) {
this.x = x;
}
}
一部のメソッドで「this.x」の代わりに「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()
て、呼び出しがこのオブジェクトによって行われることを明確にします。
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
}
ウィリアムブレンデルの投稿や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");
}
}
}
オブジェクトを使用して親子関係を構築するときに、これが使用されるのを見てきました。ただし、簡潔にするために簡略化されていることに注意してください。
Javaの「this」キーワードは、現在のクラスオブジェクトを参照するために使用されます。
Javaには「this」キーワードの6つの使用法があります。
現在のオブジェクトのメンバーが使用されていることを確認します。スレッドの安全性が懸念される場合、一部のアプリケーションは誤ったオブジェクトメンバー値を変更することがあります。そのため、これをメンバーに適用して、正しいオブジェクトメンバー値を使用する必要があります。
オブジェクトがスレッドセーフティに関係していない場合、どのオブジェクトメンバーの値を使用するかを指定する理由はありません。