【问题标题】:Is there an elegant way to change what methods/variables an object of a class can use based on the constructor used to create this object?有没有一种优雅的方法可以根据用于创建该对象的构造函数来更改类对象可以使用的方法/变量?
【发布时间】:2014-08-06 01:50:56
【问题描述】:

因此,例如,当使用不带参数的构造函数构造对象时,该对象能够/“允许”使用类中定义的方法的某个子集,并且当使用不同的方法创建对象时构造函数(例如带有参数)可以/“允许”使用类中定义的方法的不同子集。

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

  1. 在构造函数中使用反射来修改其类方法的可见性/可访问性。 (问题在于EURGH...反射

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

房间里的大象对此的明显答案是“制作 2 个不同的课程。” 我明白,我只是好奇是否有一种优雅的方式如果我想在一个班级中这样做,这样做吗?

【问题讨论】:

  • 唯一明智的答案是做大象告诉你的事情。也许“复合模式”是唯一的例外。
  • 天生不优雅。显然,如果你想使用一组方法而不是另一个,那么这两个类就不一样了。他们最多可以共享一个父级。您必须创建 2 个不同的类,如果是这种情况,可能会提取一个通用接口或抽象基。
  • 如果你使用前两种方法,你的设计会很糟糕,可能会破坏。
  • 使用装饰器模式。不幸的是,这将是 2 个以上的课程
  • 这里 cmets 提供的答案比发布的答案更好。

标签: java constructor visibility


【解决方案1】:

选项 1 和 2 都有很多问题,但幸运的是,有一种简单且相当优雅的方法可以完全按照您的意愿行事:

使用继承。

定义对象的不同版本,它们都继承了一个共同的(可能是抽象的)核心。

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

【讨论】:

    【解决方案2】:

    您实际上不能使用不同的方法子集,但您可以通过strategy pattern 进行某种“切换”。

    例如为您的构造函数设置不同的策略:

    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(...)
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2011-03-15
      相关资源
      最近更新 更多