DAO avec modèle d’object nul

Après avoir lu:
Effective Java (voir élément 43) – Joshua Bloch
Clean Code (Don’t Return Null) – Oncle Bob
Éviter! = Déclarations nulles
Modèle d’object nul

Je cherchais une réponse à la question de savoir ce qu’un DAO devrait renvoyer lorsqu’une recherche finit par être une entité qui n’existe pas pour des objects ne faisant pas partie de la collection. L’object Collection est vraiment correct en utilisant des méthodes de tableau vide ou emptyList. Mais avec des non-collections, cela pourrait être plus difficile. Une autre solution consiste à ne jamais renvoyer null et à utiliser le modèle Null Object. Mais je n’ai aucune idée d’intégrer le modèle Null Object avec DAO et je suis vraiment ravi de constater une intégration remarquable avec le modèle Null Object et le modèle DAO, en particulier pour le modèle de retour d’object (dto).

J’apprécierais et ferais bon accueil à tous les meilleurs modèles, scénarios et suggestions.

En effet, introduire une référence null est probablement l’une des erreurs les plus graves de l’histoire des langages de programmation, même son créateur, Tony Hoare, l’ appelle son erreur d’un milliard de dollars .

Voici les meilleures alternatives à null fonction de votre version de Java :

1. Java 8 et supérieur

A partir de Java 8, vous pouvez utiliser java.util.Optional .

Voici un exemple d’utilisation de ce logiciel dans votre cas:

 public Optional findMyEntity() { MyEntity entity = // some query here return Optional.ofNullable(entity); } 

2. Avant Java 8

Avant Java 8, vous pouvez utiliser com.google.common.base.Optional partir de Google Guava .

Voici un exemple d’utilisation de ce logiciel dans votre cas:

 public Optional findMyEntity() { MyEntity entity = // some query here return Optional.fromNullable(entity); } 

Tout ce que vous avez à faire est de renvoyer un object vide, par exemple une entrée client que vous auriez dans votre DAO.

if (result == null) {renvoie new EmptyUser (); }

où EmptyUser étend l’utilisateur et renvoie les entrées appropriées aux appels getter pour permettre au rest de votre code de savoir qu’il s’agit d’un object vide (id = -1, etc.)

Un petit exemple

 public class User { private int id; private Ssortingng name; private Ssortingng gender; public Ssortingng getName() { //Code here } public void setName() { //Code here } } public class EmptyUser extends User { public int getId() { return -1; } public Ssortingng getName() { return Ssortingng.Empty(); } } public User getEntry() { User result = db.query("select from users where id = 1"); if(result == null) { return new EmptyUser(); } else { return result; } } 

D’après mon expérience, dans des scénarios réels où une seule entité devrait être renvoyée, renvoyer un null est en réalité une erreur d’incohérence des données ou un manque de données, quels qu’ils soient. Dans les deux cas, la très bonne chose à faire est de DataNotFoudException votre propre DataNotFoudException . Échec rapide .

J’utilise mybatis en tant qu’ORM et j’ai récemment commencé à écrire un mappeur théoriquement à résultat unique qui sélectionne les listes retournées et valide la vérification de la quantité de données renvoyées en dao et lève des exceptions lorsque les quantités renvoyées ne correspondent pas aux hypothèses de méthode de dao. Ça marche plutôt bien.