首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在java构造函数中传递"this“

在java构造函数中传递"this“
EN

Stack Overflow用户
提问于 2010-03-11 02:17:06
回答 7查看 18.4K关注 0票数 16

查看以下代码:

public class ClassA {
    private boolean ClassAattr = false;

    public ClassA() {    
        ClassAHandler handler = new ClassAHandler(this);
    }
}

public class ClassAHandler extends GeneralHandler {
    ClassA ca = null;

    public ClassAHandler(ClassA classa) {
        this.ca = classa;
    }
}

在其他属性中,我需要访问一些ClassAHandler方法上的ClassAattr。有没有一种方法可以做到这一点,而不是在处理程序构造函数中传递原始类。我真的不喜欢这个解决方案的“外观”。

EN

回答 7

Stack Overflow用户

发布于 2010-03-11 02:20:44

从构造函数内部将this传递给另一个方法/对象可能是相当危险的。当从构造函数内部查看时,对象通常满足的许多保证并不一定是真的。

例如,如果您的类有一个final (非static)字段,那么您通常可以依赖于它被设置为一个值,并且永远不会改变。

当您查看的对象当前正在执行其构造函数时,则该保证不再成立。

另一种方法是,您可以延迟ClassAHandler对象的构造,直到第一次需要它(例如,通过在该属性的getter中执行延迟初始化)。

票数 11
EN

Stack Overflow用户

发布于 2010-03-11 02:21:13

创建一个registerHandler(ClassA处理程序)方法。

没有办法为处理程序不知道的事情创建处理程序。

票数 3
EN

Stack Overflow用户

发布于 2010-03-11 02:22:09

你可以使用内部类,然后在两个实例之间有一个隐式的父子关系。(但我不知道它是否真的更好)。

public class ClassA {
    private boolean ClassAattr = false;

    public class ClassAHandler extends GeneralHandler {

       public ClassAHandler() {
           // can access ClassAattr
       }
    }

    public ClassA() {    
        ClassAHandler handler = new ClassAHandler();
    }
}

如果您传递this,子类将需要使用parent.classAattr访问父值。根据law of demeter的说法,我们可以怀疑它是否正确。

另一种选择是ClassA在构造函数中传递ClassAHandler所需的所有信息。如果处理程序需要ClassAttr的值,则将其传递到构造函数中。

    public ClassA() {    
        ClassAHandler handler = new ClassAHandler( classAattr );
    }

但是参数是通过值传递的,所以我不知道它是否适用于您。

第三种选择是稍微更改一下设计,并将boolean放在处理程序中。然后,ClassA使用handler.handlerAttr访问子对象的值。孩子对父母一无所知,但父母可以访问孩子中他想要的任何信息。这对于law of demeter来说是更好的。

public class ClassAHandler extends GeneralHandler {     
   boolean handlerAttr;

   public ClassAHandler() {       
   }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2419410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档