没有封闭的(class here)实例可访问

Loo*_*nin 5 java

我有一个名为GreenhouseControls的课程,有一堆

内置的类如:

public class ThermostatNight extends Event {
    public ThermostatNight(long delayTime) {
      super(delayTime);
    }
    public void action() {
      // hardware control code here.
      thermostat = "Night";
    }
    public String toString() {
      return "Thermostat on night setting";
    }
  }
Run Code Online (Sandbox Code Playgroud)

我从文本文件中提取值以获取诸如"ThermostatNight"之类的事件名称和诸如"2000"之类的时间值.为了使用这些值实例化一个新对象,我构建了一个EventFactory,它接受值作为参数.

这是我为从文本文件值创建新事件对象而构建的类:

    public class EventFactory{

        public static Event createSpecificEvent(String eventName, long delayTime) {

            Event event = null;

            switch(eventName) {
            case "ThermostatNight": 
                event = new ThermostatNight(delayTime); // Compiler error
                break;
            case "ThermostatDay": 
                event = new ThermostatDay(delayTime);
                break;
            case "LightOn": 
                event = new LightOn(delayTime);
                break;
            case "LightOff": 
                event = new LightOff(delayTime);
                break;
                ...
        }
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序直到我从GreenhouseControls中取出EventFactory类并进入它自己的独立类时,一切都运行良好.现在我得到一个编译时错误,说:

"无法访问GreenhouseControls类型的封闭实例.必须使用GreenhouseControls类型的封闭实例限定分配(例如,xnew A(),其中x是GreenhouseControls的实例)."

查看EventFactory类中的内嵌注释,以查看"new ThermostatNight(delayTime)"中发生错误的位置

Jon*_*eet 5

您的类当前是内部类,需要在包含类的实例的上下文中构造.你的选择是:

  • 在构造内部类的实例时指定外部类的实例
  • 将您的嵌套类声明为static类,此时它们将不再是内部类
  • 将嵌套类移出包含的类,使它们成为顶级类

就个人而言,如果可能的话,我会选择最后一个选项 - 嵌套类有时会很有用,但是只有在有真正的好处时才应该使用它们.有各种限制可能非常微妙,如果可能,最好避免.你有任何令人信服的理由来制作这些嵌套类吗?