Java 是否有一种优雅的方法可以根据用于创建该对象的构造函数来更改类的对象可以使用的方法/变量?

Java 是否有一种优雅的方法可以根据用于创建该对象的构造函数来更改类的对象可以使用的方法/变量?,java,constructor,visibility,Java,Constructor,Visibility,例如,当对象是用一个没有参数的构造函数构造时,这个对象能够/“允许”使用类中定义的方法的某个子集,而当对象是用另一个构造函数(例如参数)创建时,它能够/“允许”使用类中定义的方法的不同子集 这些是突然浮现在脑海中的概念解决方案: 在构造函数中使用反射修改其类方法的可见性/可访问性。(这方面的问题是EURGH…反射) 在构造函数中设置布尔标志,如isAllowedToUseMethodA,以标识允许对象使用的方法。(这方面的问题是布尔检查将带来开销,并且标记为不可访问的方法仍然对对象可见,并且可以

例如,当对象是用一个没有参数的构造函数构造时,这个对象能够/“允许”使用类中定义的方法的某个子集,而当对象是用另一个构造函数(例如参数)创建时,它能够/“允许”使用类中定义的方法的不同子集

这些是突然浮现在脑海中的概念解决方案:

  • 在构造函数中使用反射修改其类方法的可见性/可访问性。(这方面的问题是EURGH…反射)

  • 在构造函数中设置布尔标志,如
    isAllowedToUseMethodA
    ,以标识允许对象使用的方法。(这方面的问题是布尔检查将带来开销,并且标记为不可访问的方法仍然对对象可见,并且可以尝试执行)


  • 房间里最明显的答案是“创建两个不同的类。”我明白,我只是好奇,如果我想在一个类中实现这一点,有没有一种优雅的方法?

    选项1和选项2都有很多问题,然而,幸运的是,有一种简单且相当优雅的方法可以完全满足您的需求:

    使用继承

    定义对象的不同版本,所有版本都继承自公共(可能是抽象)核心


    然后使用工厂方法,根据调用的工厂方法构造每个方法的正确版本。

    您实际上不能使用不同的方法子集,但可以通过

    例如,为您的构造器设置不同的策略:

    public class XXX() {
        method1Strategy = new method1Strategy1();
        method2Strategy = new method2Strategy1();
    }
    
    public class XXX( ... ) {
        method1Strategy = new method1Strategy2();
        method2Strategy = new method2Strategy2();
    }
    
    在您的方法中,您执行具体的策略:

    public Object method1(...) {
       return method1Strategy.execute(...)
    }
    
    public Object method2(...) {
       return method2Strategy.execute(...)
    }
    

    唯一明智的答案是照大象说的去做。也许“复合模式”是唯一的例外。这本质上是不优雅的。显然,如果您想使用一组方法而不是另一组,那么这两个类是不同的。最多,他们可以共享一个父母。您必须创建两个不同的类,如果是这样的话,可能会提取一个公共接口或抽象基。如果您使用前两个方法,您的设计将很糟糕,并且可能会中断。使用decorator模式。不幸的是,这将是2+类。这些评论提供了比发布的答案更好的答案。