2015-05-15 2 views
1

я ситуация представлена ​​ниже:Java: Возьмите анонимный класс вне

Class C1 { 

    public static void main(String[] args) { 
     Object o = // new object of some class 
     delegate(new C2() {    // C2 is an abstract class or interface 
      public void delegateLogic() { 
       Object my_o = o; // refrences main's local variable 
       // huge method body 
       // object o local to main is required here 
      } 
     }); 
    } 

    private void delegate(C2 c2) { 
     // method body 
    } 
} 

Тело delegateLogic(), оказывается очень большой. Для обеспечения работоспособности кода:

  1. Я хочу создать конкретный класс из C2 и оставить его снаружи, имея при этом способ использования объекта o в основном методе.
  2. Кроме того, экземпляр C2 должен быть сериализуемым, и, к сожалению, объект o не является сериализуемым. Итак, я не хочу создавать объект-член в C2, передавая объект o в конструкторе.

Любые идеи?

+1

Если вы хотите сделать это сериализуемым, вы должны найти способ захвата, по крайней мере, соответствующих частей 'o' в сериализуемой форме. – Thilo

+0

Плюс, у меня нет контроля над определением класса (возможных классов) o. – Mohitt

+0

Можете ли вы сделать статическое поле? –

ответ

1

Если вы хотите, чтобы C2 мог быть сериализован, просто объявите o переходным. Однако вам необходимо принять тот факт, что o будет иметь значение null, если оно получило сериализацию/десериализацию, если вам не удалось каким-то образом сериализовать его вручную.

public class X extends C2 { 
    private transient Object o; 

    public X(Object o) { 
     this.o = o; 
    } 

    public void delegateLogic() { 
     Object my_o = o; // refrences main's local variable 
     // huge method body 
     // object o local to main is required here 
    } 
} 
2

Если С2 становится внешний класс, то он должен иметь ссылку на О, переданные ему в той или иной форме, чтобы использовать его в delegateLogic. Вы действительно только 3 варианта для получения о в вашем C2 например:

  1. передать его в конструктор
  2. использовать метод установки
  3. передавать ее непосредственно в качестве аргумента delegateLogic

Какие из них вы выбираете, зависит от многих вещей.

Обратите внимание, что сохранение ссылки на o в переменной-члене класса не заставляет вас сериализовать эту ссылку.

Смежные вопросы