me querían para complementar la respuesta de @ Brian Agnew con esta sugerencia:
tuve un caso en el que necesitaba un comportamiento ligeramente diferente de un objeto, por lo que extendió sus capacidades con una clase interna anónima como lo hizo en el ejemplo. La clase externa era una aplicación GUI, y no la convertí en serializable porque eso simplemente no era necesario, así que, como dijo @Brian, ninguna clase interna anónima podría ser serializable, incluso si las clases que estaban extendiendo.
En esta situación, simplemente tiene que definir un comportamiento diferente para cuando una clase se deserializa y cuando se vuelve a serializar.Si usted tiene una clase con un constructor específico, utilice un método como este en su clase:
public FunctionalObject getNewFunctionalObject (String param1, String param2) {
// Use an anonymous inner class to extend the behavior
return new FunctionalObject (param1, param2) {
{
// Initialization block code here
}
// Extended behavior goes here
};
}
Así que cuando están deserializar, se puede hacer una llamada como ésta:
FunctionalObject fo = (FunctionalObject) objectInputStream.readObject();
fo = getNewFunctionalObject(fo.getParam1(), fo.getParam2());
Cuando seria, Deberá crear un objeto new
que sea un clon del objeto anterior. Algunas clases tienen este comportamiento integrado, y en otras tendrás que definirlo específicamente. Para la serialización, si usted tiene un constructor que puede clonar, o si su clase tiene el método clone
definido, usted puede hacer esto:
objectOutputStream.writeObject (fo.clone());
Entonces, el clone
de ese objeto ya no será una referencia a su clase interna anónima, pero una referencia a una copia real del objeto, que es serializable.
En el caso de tu ejemplo, podríamos haber hecho esto:
// Assuming objectOutputStream has already been defined
Map<String, String> params = new HashMap<String, String>() {{
put("param1", "value1");
put("param2", "value2");
}};
objectOutputStream.writeObject (new HashMap<String,String> (params));
Esto funciona porque la clase HashMap
tiene un constructor que devolverá un clon de cualquier HashMap
se pasa en ella. Fueron muchas palabras para decir algo simple, pero deseé haber tenido este consejo antes.
Por 'initializador estático', ¿quiere decir' initializer de instancia'? –
Entonces, ¿cuál sería la clase de inclusión esperada? – Shark
@ Eng.Fouad - whoops. Enmendado –