是一个自我引用的对象证据代码设计错误

时间:2011-05-10 17:24:01

标签: java coding-style

我在一些我正在看的代码中遇到过自我引用。

实施例

TestObject selfReference = this;

是否有一个好的案例,你需要在对象中进行自我引用?这是不良编码设计或风格的标志吗?

编辑:

这是一个示例,如果我使用this它会抛出错误,但是当使用selfReference时,它会编译。


public class IFrame extends InternalFrame
{
    public IFrame()
    {
         addComponentListener(new java.awt.event.ComponentAdapter()
        {
            public void componentResized(java.awt.event.ComponentEvent evt) 
            {
                Window.setCurrComponent(this); //compile error
            }
            public void componentMoved(ComponentEvent evt)
            {
                Window.setCurrComponent(selfReference); //compiles correctly
            }
        });
    }
}

public class InternalFrame extends JInternalFrame
{
    protected InternalFrame selfReference = this;
}

public class Window
{
    InternalFrame currFrame;

    public static void setCurrComponent(InternalFrame iFrame)
    {
        currFrame = iFrame
    }
}

10 个答案:

答案 0 :(得分:14)

是的,在某些情况下,隐式自我引用可能完全是自然的。例如,考虑一个当前只包含单个元素的循环链表。

然而,拥有一个名为selfReference的成员变量根本没有任何意义。

答案 1 :(得分:8)

我会捅这个。我猜这个代码的作者不知道你可以写一个Classname.this当你想从嵌套类访问“外部这个”。

也就是说,他创建了一个这样的结构:

class Executor {
    public void execute(Example example) {

    }
}

public class Example {

    Example selfReference = this;

    class Nested {
        public void method() {
            //Oh, oh, can't do this: 
            //new Executor().execute(this);
            //It gives:
            //The method execute(Example) in the type Executor is not applicable for the arguments (Example.Nested)

            //How the hell do I invoke the executor method from here?
            //lets do something really odd.
            new Executor().execute(selfReference);

            //This is what he should have done
            new Executor().execute(Example.this);
        }
    }

}

答案 2 :(得分:4)

没必要。

自引用的一个完全有效的例子是需要一些处理程序的对象。如果对象实现了该处理程序接口本身,则对handler的引用是对同一对象的引用。完全可以,恕我直言。

答案 3 :(得分:2)

使用更新的代码示例,您似乎无法从匿名内部类引用外部对象。语法是:

OuterClass.this

在你的情况下:

public void componentResized(java.awt.event.ComponentEvent evt) 
{
    Window.setCurrComponent(IFrame.this); //no more compile error
}

如果您仅使用this,则引用new ComponentAdapter()

感谢您提供更多背景信息。

答案 4 :(得分:2)

如果没有更多上下文,代码不会做任何有用的事情,并且可能会造成混淆。我不认为它有资格作为“设计”或“风格”。

然而,更多背景可能会说明为什么要这样做。

答案 5 :(得分:2)

我想说这是代码不好的标志:

  • 每个人都知道this的含义,所以我看不出需要名为selfReference
  • 的引用
  • 除非您计划稍后将该引用更改为其他内容 - 例如

TestObject selfReference = this; //在此调用一些函数 selfReference = someOtherObject; //其中someOtherObject也是TestObject的一个实例 //在someOtherObjects上调用一些函数

  • 但是,如果是这种情况并且引用在某个时刻被重新分配给其他内容,则不应该将其称为selfReference - 因为它最终可能不会引用self / this!

答案 6 :(得分:2)

我会说自我引用Java 中的错误代码的标志,特别是如果它的名称类似于“selfReference”,因为Java已经有一个名为“this”的标准自引用。在支持闭包的语言中,这是一个不同的故事,因为非自引用可以将“this”对象保留在闭包的范围内。

答案 7 :(得分:1)

Window.setCurrComponent(本); //编译错误 上面的语句中的'this'不是InternalFrame对象的ComponentAdapter对象,因为你在Anonymous内部类中。

Window.setCurrComponent(selfReference); //正确编译 如果要引用IFrame类的对象,则上面的行是正确的语句。

答案 8 :(得分:1)

如果您正在编写解析器并且数据结构包含相同类型的子元素,那么您需要具有相同类的成员变量。

答案 9 :(得分:0)

有很多次你想使用this。您应该在需要引用它所属的对象的情况下。我认为没有任何理由从this创建一个对象,只需一个简单的this.attribute即可。