在java中通过接受的方法调用“this”

在方法调用中传递当前对象是好还是坏? 如:

public class Bar{ public Bar(){} public void foo(Baz baz){ // modify some values of baz } } public class Baz{ //constructor omitted public void method(){ Bar bar = new Bar(); bar.foo(this); } } 

具体来说就是bar.foo(this)可以接受的吗?

没有理由不使用它, this是当前的实例,使用它是完全合法的。 事实上,通常没有干净的方法来省略它。

所以使用它。

由于很难说服它是可以接受的没有例子(这个问题的否定答案总是比较容易争论),我只是打开了一个最常见的java.lang类, String之一,当然,我发现这种使用的实例, 例如

 1084 // Argument is a String 1085 if (cs.equals(this)) 1086 return true; 

在大“接受”项目中寻找"(this" ,你不会找不到它。

这没有什么错。 不好的做法是在构造函数中做同样的事情,因为你会给一个尚未完全初始化的对象的引用。

这里有一个类似的post: Java在构造函数中泄漏了这个 ,他们给出了解释为什么后者是不好的做法的解释。

是的 ,但你应该小心两件事

  1. 当对象尚未构造时(即在其构造函数中)传递时,
  2. 将它传递给一个长寿命的对象,这将保持参考的活性,并防止这个对象被垃圾收集。

这是完全正常的,完全可以接受的。

这代表当前的对象。 你在做什么是sytatically正确的,但我不认为这是一个需要,如果你是在同一类中调用的方法。

是。 你可以使用它。它在编程中很常见,可以通过this 。但是使用它有利有弊。如果这样做没有危险。

如果没有更复杂的select来实现相同的行为,那么在方法调用中传递当前对象是不好的做法

根据定义,只要从一个对象传递到另一个对象,就会创build一个双向关联。

引用Martin Fowler的“重构”:

将双向关联更改为单向(200)

双向关联是有用的,但是它们带有价格。 价格是维护双向链接和确保正确创build和删除对象的复杂性。 双向关联对许多程序员来说并不自然,所以他们往往是错误的来源

当你需要时你应该使用双向关联,但是当你不需要的时候则不要。 只要你看到一个双向的联系不再拖垮它的重量,就放弃不必要的结果。

所以,从理论上讲,当我们发现需要通过的时候,我们应该听到警钟,并且想尽办法想办法解决手头的问题。 当然,有些时候,最后的做法是有道理的。

另外,经常需要暂时破坏你的devise,做一些糟糕的事情,在长期的代码重构中进行整体的改进。 (退一步,前进两步)。

在实践中,我发现我的代码通过避免像鼠疫这样的双向链接而得到了大规模的改进。

只是添加一个例子,通过this是正确的,遵循良好的devise: 访问者模式 。 在访问者devise模式中,方法accept(Visitor v)通常以其调用v.visit(this)

可接受

Oracle JAVA文档片段:

在实例方法或构造函数中,这是对当前对象的引用 – 即其方法或构造函数被调用的对象。 您可以通过使用此方法从实例方法或构造函数中引用当前对象的任何成员。

与一个字段一起使用

使用this关键字的最常见原因是因为字段被方法或构造函数参数遮蔽。

java中的所有东西都是按值传递的。 但是对象从来不会传递给方法!
当java将一个对象传递给一个方法时,它首先创build一个对该对象的引用的副本,而不是该对象本身的副本。 因此,这是在java中完美使用的方法。 最常用的用法