9 erreurs à éviter lors de la programmation en Java
Rafal Sawicki
Développeur Java
Quelles sont les erreurs à éviter lors de la programmation en Java ? Dans l'article suivant, nous répondons à cette question.
Java est une langue populaire qui jouit d'une position bien établie dans le monde de l'informatique. développement de logiciels. Il s'agit d'un langage de programmation puissant et polyvalent. Environ 3 milliards d'appareils dans le monde fonctionnent avec Java et, par conséquent, au moins 3 milliards d'erreurs ont été commises lors de son utilisation. Dans cet article, nous allons nous concentrer sur la manière de ne plus en faire.
1. Obtention de l'exception de modification simultanée
C'est de loin l'erreur la plus fréquente que j'ai rencontrée. Au début de ma carrière, je l'ai également commise à de nombreuses reprises. Cette erreur se produit lorsque vous essayez de modifier la collection pendant que vous la parcourez. L'erreur Exception de modification simultanée peut également être soulevée lorsque vous travaillez avec plusieurs threads, mais pour l'instant, concentrons-nous sur un scénario de base.
Supposons que vous ayez un Collection d'utilisateurs dont certains sont des adultes et d'autres non. Votre tâche consiste à filtrer les enfants.
for (User : users) {
if (!user.isAdult())) {
users.remove(user) ;
}
}
L'exécution du programme susmentionné code aboutit à l'obtention de Exception de modification simultanée. Où nous sommes-nous trompés ? Avant de terminer notre itération, nous avons essayé de supprimer certains éléments. C'est ce qui a déclenché l'exception.
Comment l'éviter ?
Dans ce cas, il existe plusieurs approches qui peuvent s'avérer utiles. Tout d'abord, tirez parti de Java La bonté du 8 - Flux.
List adultes = users.stream()
.filter(User::isAdult)
.toList() ;
L'utilisation d'un Prédicat nous avons fait l'inverse de la condition précédente - nous déterminons maintenant les éléments à inclure. L'avantage d'une telle approche est qu'il est facile d'enchaîner d'autres fonctions après l'élimination, par exemple carte. Mais pour l'amour du ciel, n'essayez pas de faire quelque chose comme ce qui suit :
Il pourrait également se retrouver dans la Exception de modification simultanée car vous modifiez la source du flux. Cela peut également donner lieu à d'autres exceptions qui ne seront pas faciles à déboguer.
Pour résoudre Exception de modification simultanée dans un scénario à un seul fil. vous pouvez également utiliser directement la fonction Itérateur et son supprimer() ou vous pouvez simplement ne pas supprimer d'éléments pendant l'itération. Cependant, je recommande d'utiliser la méthode Cours d'eau - nous sommes en 2022.
2. Stockage des mots de passe sous forme de chaînes de caractères
Comme je m'intéresse de plus en plus à la cybersécurité, je ne serais pas fidèle à moi-même si je ne mentionnais pas au moins un des éléments suivants Erreur de Java qui peut entraîner un problème de sécurité. Le stockage des mots de passe reçus des utilisateurs dans un Chaîne est exactement ce dont vous devriez avoir peur.
Le problème (ou peut-être l'avantage) de la Chaîne est qu'il est immuable. Dans le monde cybernétique, cela constitue une menace potentielle, car il est impossible d'effacer la valeur d'une valeur créée une fois. Chaîne objet. Le pirate qui accède à la mémoire de votre ordinateur peut y trouver des mots de passe en texte clair.
Deuxièmement, les chaînes de caractères en Java sont internalisés par la JVM et stockés dans l'espace PermGen ou dans l'espace heap. Lorsque vous créez un Chaîne il est mis en cache et n'est supprimé que lorsque le collecteur de déchets commence à faire son travail. Vous ne pouvez pas savoir avec certitude quand votre mot de passe est supprimé du pool de chaînes, car le collecteur de déchets fonctionne de manière non déterministe.
Comment l'éviter ?
L'approche recommandée consiste à utiliser char[] ou, mieux encore, la bibliothèque qui permet de stocker les mots de passe en tant que char[], par exempleMot de passe4j. Les char[] est mutable et peut être modifié après son initialisation. Après avoir traité un mot de passe, vous pouvez simplement effacer le tableau char[] en y inscrivant des caractères aléatoires. Si les attaquants ont accès à la mémoire de votre ordinateur, ils ne verront que des valeurs aléatoires qui n'ont rien à voir avec les mots de passe des utilisateurs.
3. la (non-)gestion des exceptions
Les débutants et les programmeurs plus avancés ne savent pas comment gérer correctement les exceptions. Leur principal péché en la matière est de les ignorer. CE N'EST JAMAIS UNE BONNE APPROCHE.
Malheureusement, nous ne pouvons pas vous donner une solution miracle qui conviendrait à tous les types d'entreprises. Exceptionque vous rencontrez. Vous devez réfléchir à chaque cas séparément. Toutefois, nous pouvons vous donner quelques conseils sur la manière de commencer à travailler sur ce sujet.
Comment l'éviter ?
Ignorer Exceptionn'est jamais une bonne pratique. Exceptionsont ajoutés pour une raison ou pour une autre, vous ne devez donc pas les ignorer.
try {...} catch(Exception e) { log(e) ; } est rarement la bonne approche pour Exception manipulation.
Lancer Exceptionafficher une boîte de dialogue d'erreur à l'utilisateur ou au moins ajouter un message complet au journal.
Si vous avez laissé vos exceptions non gérées (ce que vous ne devriez pas faire), expliquez vous au moins dans le commentaire.
4. L'utilisation de la nullité
Malheureusement, il est assez fréquent de trouver une fonction Java qui, dans certains cas, renvoie un nul. Le problème est qu'une telle fonction oblige son client à effectuer une vérification de la nullité du résultat. Sans cette vérification, la fonction NullPointerException est lancé.
L'autre chose est de passer un nul valeur. Pourquoi y avez-vous pensé ? Dans ce cas, la fonction doit effectuer un contrôle de nullité. Lorsque vous utilisez des bibliothèques tierces, vous ne pouvez pas modifier l'intérieur des fonctions. Que se passe-t-il alors ?
Plus important encore, les autres développeurs qui liront votre code et verront que vous réussissez nul sera probablement désorienté quant à la raison pour laquelle vous avez choisi une manière aussi bizarre de mettre en œuvre votre fonctionnalité.
Comment l'éviter ?
Ne pas renvoyer de nul valeur ! Jamais ! Si votre fonction renvoie un type de Collectionvous pouvez simplement renvoyer un Collection. Si vous traitez des objets uniques, vous pouvez utiliser le modèle de conception de l'objet nul. Depuis le Java 8, il est mis en œuvre comme suit En option. Par ailleurs, l'approche la moins recommandée consiste à déposer une demande d'asile auprès de la Commission européenne. Exception.
5. Concaténation de chaînes lourdes
J'espère que vous ne commettrez pas cette erreur, car il s'agit de la question d'entretien la plus populaire (ou peut-être la deuxième plus populaire après FizzBuzz). Comme vous devriez le savoir maintenant, un Chaîne est immuable dans Java - une fois créé, il ne peut être modifié. Ainsi, la concaténation de Chaîne signifie beaucoup d'allocation de mémoire inutile. La concaténation de Chaîne à chaque fois nécessite la création d'un fichier temporaire StringBuilder et de le retransformer en chaîne de caractères. Cette solution ne convient donc absolument pas si l'on souhaite combiner un grand nombre de caractères.
Comment l'éviter ?
Pour résoudre ce problème, utilisez StringBuilder. Il crée un objet mutable qui peut être facilement manipulé. Bien sûr, vous pouvez toujours utiliser StringBuffer si votre projet est utilisé dans un contexte concurrent.
6. Ne pas utiliser les solutions existantes
Lorsque l'on développe un logiciel, il est indispensable de connaître les bases du langage dans lequel on écrit, mais ce n'est pas suffisant. De nombreux problèmes algorithmiques rencontrés lors de la mise en œuvre d'une nouvelle fonctionnalité ont déjà été résolus par quelqu'un d'autre. J'ai trop souvent vu quelqu'un mettre en œuvre un algorithme de sécurité en partant de zéro. Une telle approche est sujette aux erreurs. Une seule personne ne peut pas tester à fond une solution aussi complexe. Le savoir collectif de l'équipe équipe composée de programmeurs moyennement avancés est presque toujours meilleure que la grandeur d'un seul prodige. Développeur Java. Il n'est pas nécessaire de réinventer la roue, il suffit d'adapter la solution existante à vos besoins.
Comment l'éviter ?
Essayez de rechercher des bibliothèques qui abordent le problème sur lequel vous travaillez. Essayez de trouver des solutions similaires. De nombreuses bibliothèques disponibles sur le web sont gratuites et ont été perfectionnées et testées par des développeurs expérimentés et par l'ensemble de la communauté Java. N'ayez pas peur de les utiliser.
7. Manque de temps pour la rédaction des tests
Il est tentant de croire que notre code fonctionnera toujours parfaitement. Ne pas écrire de tests pour le code est le pire péché de l'humanité. Java développeurs de logiciels. Beaucoup d'entre nous préfèrent les tests manuels et exploratoires aux tests unitaires, ce qui est complètement fou. <Pourquoi perdre du temps à écrire des tests alors que vous pouvez vous concentrer sur la fourniture du meilleur code au monde pour votre projet, qui n'a DEFINITIVEMENT pas de bugs ? Il s'avère que la réalité est brutale et qu'il est impossible de fournir un code de haute qualité sans écrire de tests.
Comment l'éviter ?
Vous devriez toujours préparer des tests pour votre code. Je sais que l'approche TDD n'est pas si facile à maintenir, mais vous devriez au moins fournir des tests qui couvrent toutes les conditions dans lesquelles votre code peut être exécuté. Cela inclut les tests des situations exceptionnelles. Les tests unitaires sont nécessaires. Vous devez les fournir pour chaque fonctionnalité de votre projet si vous voulez vous assurer que votre code est facile à remanier et extensible dans le cadre de développements ultérieurs.
Encore une chose. Maintenez un niveau élevé de votre code de test - cela en vaut la peine. C'est le conseil de l'oncle Bob et je suis tout à fait d'accord avec lui.
En outre, n'oubliez pas les autres types de tests. Les tests d'intégration sont un élément à prendre en compte dans tous les projets.
8. Oublier les modificateurs d'accès
Privés et publics, n'est-ce pas ? Comment pouvons-nous les oublier ? Il s'avère qu'il y en a d'autres. Lorsque vous avez commencé à apprendre JavaVous avez certainement appris l'existence des modificateurs d'accès protégés. Ils peuvent être utiles dans certains cas, il est donc utile de connaître leur existence.
Développeurs Java semblent souvent oublier la portée du paquetage. Il est facile de ne pas se souvenir de l'utiliser puisqu'elle est implicite et ne nécessite aucun Java mots-clés. La portée du paquet est importante. Elle vous permet de tester une méthode protégée. Les éléments protégés sont accessibles à partir du chemin de la classe de test, à condition que le paquetage soit le même.
Comment l'éviter ?
N'oubliez pas le modificateur protégé et que le champ d'application du paquet vous permet de le tester.
9. Utilisation de JavaEE pur au lieu de Spring
L'étape suivante après l'apprentissage Java SE est d'apprendre à gérer Java sur les serveurs, comment créer une application d'entreprise.
Les débutants tombent souvent dans le piège de l'apprentissage de JavaEE car il existe un grand nombre de tutoriels à ce sujet. Même "Thinking in Java", le Programmeurs Javamentionne JavaEE et ne dit rien des autres options.
Comment l'éviter ?
JavaEE est une chanson du passé. De nos jours, Spring est un outil indispensable et Java EE est simplement un atout. Toutes les applications d'entreprise modernes utilisent Spring, c'est pourquoi vous devriez fortement envisager d'apprendre ici.