如何从main方法外部访问main方法中实例化的对象?

时间:2013-12-18 00:05:45

标签: java

这是我的主要目标:

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对象,但这将是一个没有我需要保存的任何数据的新实例......对吗?

1 个答案:

答案 0 :(得分:1)

将其保存在类变量中 (也称为班级的领域)。 这是正确的方法。

所以这应该进入类级别(在所有方法之外)。

private static GreenhouseControls gc = null;

然后,例如在你刚才做的主要方法中:

gc = new GreenhouseControls();

从那里开始,你班级的任何方法都可以访问gc。