La manipulation des valeurs null dans protobuffers
Je suis en train de travailler sur quelque chose qui récupère des données à partir de la base de données et les constructions protobuff message. Compte tenu de la possibilité que les valeurs nulles peuvent être récupérées à partir de la base de données pour certains champs , je vais obtenir Null pointer exception, tout en essayant de construire le protobuff message. Arriver à savoir que null n'est pas pris en charge dans protobuffs le fil http://code.google.com/p/protobuf/issues/detail?id=57, je me demande si le seul autre moyen de gérer les NPE se faire jeter consiste à insérer des contrôles manuels dans le fichier java correspondant à la proto comme ci-dessous!
message ProtoPerson{
optional string firstName = 1;
optional string lastName = 2;
optional string address1 = 3;
}
ProtoPerson.Builder builder = ProtoPerson.Builder.newBuilder();
if (p.getFirstName() != null) builder.setFirstName(p.getFirstName());
if (p.getLastName() != null) builder.setLastName(p.getLastName());
if (p.getAddress1() != null) builder.setAddress1(p.getAddress1());
...
Donc, quelqu'un peut-il préciser si il y a de quelque autre manière efficace de gérer les valeurs nulles durant protobuff construction??
- Version courte de la même chose:
Optional.ofNullable(p.getFirstName()).ifPresent(builder::setFirstName);
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de solution facile à ce. Je vous recommande juste de traiter avec le nul de contrôles. Mais si vous voulez vraiment vous débarrasser d'eux, voici quelques idées:
setOrClearFoo()
méthodes de chaque classe Java. Le générateur de code Java fournit les points d'insertion pour cela (voir la fin de cette page).get*()
méthodes dep
, appeler, vérifier pournull
, et ensuite appeler laset*()
méthode debuilder
si non null. Cela aura l'avantage supplémentaire que vous n'aurez pas à mettre à jour votre copie de code à chaque fois que vous ajoutez un nouveau champ, mais il sera beaucoup plus lente que d'écrire du code que de copies de chaque champ explicitement.Avertissement: la Réponse d'un Googleurs à l'aide de protobufs sur une base quotidienne. Je ne suis pas représentant de Google de toute façon.
Person
au lieu dePersonProto
ouProtoPerson
. Compilé protobufs sont juste des définitions de classe spécifiée par la langue que vous utilisez, avec quelques améliorations. L'ajout de "Proto" est extra verbosité.YourMessage.hasYourField()
au lieu deYourMessage.getYourField() != null
. La valeur par défaut pour protobuf chaîne est une chaîne vide, ce qui ne PAS égale à null. Alors que, peu importe si votre domaine n'est pas défini ou désactivée ou une chaîne vide,.hasYourField()
renvoie toujours false. Voir les valeurs par défaut pour la commune de protobuf types de champ.null
. Même à l'extérieur de la protobuf,null
provoque toutes sortes de problèmes. Utilisation.clearYourField()
à la place.Person.Builder
classe ne PAS ont un.newBuilder()
méthode.Person
classe. Comprendre les Générateur de Modèle comme ceci: Vous créez un nouveau constructeur que si vous ne le possédez pas encore.Une réécriture de votre protobuf:
Une réécriture de votre logique:
Et si
thatPerson
est un objet personne que vous avez créé qui a les valeurs d'attribut qui peut être une chaîne vide, des espaces vides ou nulles, alors je vous recommande d'utiliser La goyave estChaînes de caractères
de la bibliothèque: