我有一个名为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)”中发生错误的位置
答案 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);
...
}