这是我的主要目标:
public static void main(String[] args) {
try {
String option = "-f";
String filename = "src/greenhouse/examples4.txt";
if ( !(option.equals("-f")) && !(option.equals("-d")) ) {
System.out.println("Invalid option");
printUsage();
}
GreenhouseControls gc = new GreenhouseControls();
if (option.equals("-f")) {
gc.addEvent(gc.new Restart(0,filename));
}
gc.run();
}catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Invalid number of parameters");
printUsage();
}
}
我正在创建一个序列化GreenhouseControls对象并保存其状态的方法,以便我以后可以恢复它。它看起来像这样:
public void saveState() {
try{
// Serialize data object to a file
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("GreenhouseControls.ser"));
out.writeObject(**gc**); // Can't do this from outside main method..
out.close();
// Serialize data object to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
out = new ObjectOutputStream(bos) ;
out.writeObject(**gc**); // Can't do this from outside main method...
out.close();
// Get the bytes of the serialized object
byte[] buf = bos.toByteArray();
} catch (IOException e) {
}
}
我无法在main中进行序列化,因为我必须在发生在另一个类中的run()方法中的shutdown方法之前对其进行序列化。它看起来像这样:
public abstract class Controller {
private List<Event> eventList = new ArrayList<Event>();
public void addEvent(Event c) {
eventList.add(c);
}
public abstract void shutdown();
public void run() {
while(eventList.size() > 0)
for(Event e : new ArrayList<Event>(eventList))
if(e.ready()) {
System.out.println(e);
try {
e.action();
}
catch(ControllerException ex) {
System.err.println("Reason: " + ex + "\n");
saveState(); // There is where I want to invoke it..
shutdown();
}
eventList.remove(e);
}
}
}
因此,重申一下,有没有办法获得主要的'gc'GreenhouseControls对象?我知道我可以在run()方法中创建一个新的GreenhouseControls对象,但这将是一个没有我需要保存的任何数据的新实例......对吗?
答案 0 :(得分:1)
将其保存在类变量中 (也称为班级的领域)。 这是正确的方法。
所以这应该进入类级别(在所有方法之外)。
private static GreenhouseControls gc = null;
然后,例如在你刚才做的主要方法中:
gc = new GreenhouseControls();
从那里开始,你班级的任何方法都可以访问gc。