【问题标题】:java inner class private constructor, public membersjava内部类私有构造函数,公共成员
【发布时间】:2016-07-31 13:30:04
【问题描述】:

我想知道这是否是设计课程的首选方式;如果不是,它有什么问题,还有什么更好的选择?

class Calculator {

   public Calculator(Input input) {...};
   CalculatorOutput output;

   class CalculatorOutput {
   private CalculatorOutput() {} //private constructor - so no one other than Calculator can instantiate this class
   Double someCalcStuff;
   List<Double> someOtherCalcStuff;
}

    public void calculate() {
    CalculatorOutput op = new CalculatorOutput();
    //..after this function populates the someCalcStuff & someOtherCalcStuff; it just returns an instance of CalculatorOutput
}

...
return op;

}

//usage

Calculator.CalculatorOutput result = new Calculator(input).calculate();
for (Double d: result.someOtherCalcStuff) {...}

我将 CalculatorOutput 作为 Calculator 的内部类的原因是 b/c 除了返回计算器的输出之外没有其他目的或上下文。我将 CalculatorOutput 的成员设为 public b/c 我并没有真正看到将它们设为 private 的意义,然后通过 getter/setter 访问......因为我不希望这个内部类被继承,或者做任何其他这篇文章中提到的功能:Why use getters and setters?

用户无法实例化内部类(私有构造函数),因此我认为创建内部类的公共可访问成员(CalculatorOutput)没有真正的缺点

具体问题:

  • 这种方法不好吗?为什么?
  • 有什么更好的方法来实现这一目标?

【问题讨论】:

  • 我认为根本不需要内部类
  • 为避免在 Calculator 类中包含 CalculatorOutput,您可以声明 CalculatorOutput 且无法访问(例如,类 CalculatorOutput {}),并且您将在同一个包中包含 Calculator 和 CalculatorOutput。然后只有该包内的类可以访问 CalculatorOutput 。我说的是 Java 中的访问级别。你可以在这里阅读更多:docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
  • 我认为这个问题更适合 codereview.stackexchange.com。看看codereview on-topic help page。在那里你可能会得到更有用的反馈。
  • @Erick:我知道包保护是另一种选择..谢谢...@DaoWen:有没有办法我可以将它“交叉发布”到 stackexchange codereview(并可能从在这里?)谢谢

标签: java inner-classes public-method


【解决方案1】:

为了使代码更简洁,我要做的是创建一个计算器包并将以下类添加到该包中:

  1. 计算器
  2. 计算器输出

我会做出以下更改:(将成员设为私有并在需要时提供 getter 和 setter)

class Calculator {
    private CalculatorOutput output;

    public Calculator(Input input) {/* logic here */} 

     // getters and setters
}

class CalculatorOutput {

    private Double someCalcStuff;

    private List<Double> someOtherCalcStuff;

    // getters and setters

    CalculatorOutput() {} 
}

public class Test{

    public static void main(String [] args)
    {
        Calculator calc = new Calculator();

        CalculatorOutput output = new CalculatorOutput();

        // use methods as needed
    }
}

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 2013-02-18
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2011-02-08
    • 2017-04-30
    相关资源
    最近更新 更多