@SuppressWarnings ("serial")

j'ai une question parce que je suis un peu confus (ou peut-être que je ne remarque pas quelque chose d'évident). Disons que j'ai un peu de code source qui contient beaucoup de classes qui contiennent un grand nombre de champs statiques définies comme ceci:

public final class ConverterTYPE  {
    private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>() {
        {
            put("A", new Byte((byte)12));
            put("B", new Byte((byte)13));
        }
    };

}

comme nous le savons tous, les champs statiques ne seront pas sérialisés.

cependant, Java (et Eclipse) se plaint que "la classe serialisable ne déclare pas un champ final serialVersionUID statique de type long". Pourquoi ne remarquent-ils pas que les parasites ne seront pas sérialisés?

à la question suivante: serait-il une bonne solution à ce problème à utiliser @SuppressWarnings("serial") pour se débarrasser de tous ces avertissements?

EDIT:

aucune de mes classes n'implémente l'interface sérialisable (ou aucune de leurs superclasses). Et Eclipse montre HashMap<String, Byte> avec ses mises en garde. Pourquoi ne pas détecter que c'est un champ statique?

16
demandé sur Lukasz 2011-01-20 18:44:26

2 réponses

ce n'est pas parce que ce champ n'est pas sérialisé que la chose à laquelle il renvoie ne le sera jamais! Quelqu'un d'autre pourrait obtenir une référence à cette carte et essayer de la sérialiser directement, ou l'utiliser comme un membre d'instance dans une classe serialisable, etc.Je vois qu'il est privé, mais s'assurer qu'il ne sera jamais accédé en dehors de la classe courante ou réglé sur un membre d'instance est au-delà de la portée du compilateur (et impossible avec la réflexion autour de toute façon).

un la solution possible est simplement d'éviter que la sous-classe anonyme w / initializer style tous ensemble et faire ceci:

private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>();

static {  
  STRING_MAP.put("A", new Byte((byte)12));
  STRING_MAP.put("B", new Byte((byte)13));
}

le résultat est presque identique dans la plupart des cas et votre code n'est pas truffé de classes anonymes.

22
répondu Affe 2018-05-05 11:08:25

cependant, Java (et Eclipse) se plaint que "la classe serialisable ne déclare pas un champ final serialVersionUID statique de type long". Pourquoi ne remarquent-ils pas que les parasites ne seront pas sérialisés?

le message d'erreur et le fait que vous ayez une variable membre statique finale dans votre classe (du moins, c'est comme ça que j'interprète votre description) n'ont rien à voir l'un avec l'autre.

Votre classe implémente l'interface Serializable, ou une des superclasses de votre classe fait ça. Donc le compilateur remarque que votre classe est sérialisable. Les classes sérialisables doivent avoir un champ final statique appelé serialVersionUID qui est utilisé pour le versioning lorsque vous sérialisez des instances de votre classe.

à l'Aide de l'annotation @SuppressWarnings("serial") fait taire le compilateur à propos d'un manquant serialVersionUID. Donc oui, vous pouvez l'utiliser pour vous débarrasser du message d'avertissement, mais une meilleure solution est de faire en sorte que votre classe n'implémente pas Serializable (directement ou indirectement) si elle n'est pas destinée à être sérialisée.

19
répondu Jesper 2011-01-20 15:49:51