95

在方法调用中传递当前对象是好/坏/可接受的做法吗?如:

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)可以接受吗?

4

10 回答 10

166

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

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

于 2013-07-03T07:17:55.787 回答
156

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

所以使用它。

由于没有例子很难说服它是可以接受的(对这样的问题的否定回答总是更容易争论),我刚刚打开了最常见的java.langString之一,当然我发现了这种用法的实例,例如

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

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

于 2013-07-03T07:16:28.427 回答
42

的,但你应该注意两件事

  1. 在对象尚未构造时 传递this (即在其构造函数中)
  2. 将 this 传递给一个长期存在的对象,这将使引用保持活动状态并防止this对象被垃圾收集。
于 2013-07-03T09:50:26.100 回答
13

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

于 2013-07-03T07:16:48.120 回答
5

this 代表当前对象。您所做的在语法上是正确的,但如果您在同一个类中调用该方法,我认为不需要这样做。

于 2013-07-03T07:17:13.893 回答
4

是的。你可以使用它。它在编程中很常见this。但是使用它有优点和缺点。但这样做并不危险。

于 2013-07-03T07:17:16.897 回答
4

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

根据定义,一旦this从一个对象传递到另一个对象,就会创建双向关联。

引用 Martin Fowler 的重构:

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

双向关联是有用的,但它们是有代价的。代价是维护双向链接和确保正确创建和删除对象的复杂性。双向关联对许多程序员来说并不自然,因此它们通常是错误的来源

...

您应该在需要时使用双向关联,而不是在不需要时使用。一旦你看到双向关联不再发挥作用,就放弃不必要的一端。

this所以,理论上,当我们发现我们需要通过并努力想其他方法来解决手头的问题时,我们应该听到警钟。当然,有时候,最终,这样做是有意义的。

此外,在长期重构代码以实现整体改进期间,通常需要暂时破坏您的设计,做“坏事”。(后退一步,前进两步)。

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

于 2013-07-03T17:00:21.097 回答
2

只是再添加一个传递this正确且遵循良好设计的示例:访问者模式。在访问者设计模式中,方法accept(Visitor v)通常以它调用的方式实现v.visit(this)

于 2013-07-10T06:15:25.453 回答
1

可接受

来自 Oracle JAVA 文档的片段:

在实例方法或构造函数中,this 是对当前对象的引用——调用其方法或构造函数的对象。您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员。

将其与字段一起使用

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

于 2013-07-03T07:20:01.253 回答
0

java中的一切都是按值传递的。但是对象永远不会传递给方法!
当java将一个对象传递给一个方法时,它首先会复制一个对该对象的引用,而不是复制该对象本身。因此,这是java中完美使用的方法。最常见的用法。

于 2013-07-03T07:21:29.897 回答