我在一些我正在看的代码中遇到过自我引用。
实施例
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
}
}
答案 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
即可。