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

时间:2013-12-13 22:20:46

标签: 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";
    }
  }

我从文本文件中提取值以获取诸如“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;
                ...
        }
}

当我运行该程序时,一切都运行良好,直到我从GreenhouseControls中取出EventFactory类并进入它自己的独立类。现在我收到一个编译时错误,上面写着:

  

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

在EventFactory类中查看内联注释,以查看“new ThermostatNight(delayTime)”中发生错误的位置

2 个答案:

答案 0 :(得分:5)

您的类目前是inner classes,需要在包含类的实例的上下文中构造。您的选择是:

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

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

答案 1 :(得分:4)

错误意味着正在从静态方法实例化非静态内部类ThermostatNight。您需要使类静态(给出代码的最可能的解决方案),使方法非静态,或明确提供实例。

public static /*<<==Add this*/ 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";
    }
}

要明确提供实例,请使用以下示例:

public static Event createSpecificEvent(GreenhouseControls ctrl, String eventName, long delayTime) {
    Event event = null;
    switch(eventName) {
    case "ThermostatNight": 
        event = ctrl.new ThermostatNight(delayTime);
    ...
}