Ce qui a changé entre la 2e édition effective de Java et la 3e édition

À propos de cet article

La 3e édition effective de Java a été publiée. De nouveaux éléments de langage de Java 7 à Java 9 ont été ajoutés, et je pense que c'est Lambda pour le moment, mais je m'inquiétais des autres changements et ajouts. J'ai donc comparé les 2e et 3e éditions côte à côte et vérifié grossièrement ces endroits.

Dans cet article, j'ai répertorié les endroits que je pensais "peut-être caractéristiques!" Pas sur les nouveaux éléments, mais sur les changements dans les éléments existants. [^ 1] Peut-être que vous n'avez jamais envie de lire cet article, mais plutôt une référence pour ceux qui ont lu la 2ème édition pour réapprendre la 3ème édition. Je pense qu'il sera utilisé comme ça. Je pense qu'il y a beaucoup de malentendus et d'omissions, alors appréciez la recherche d'erreurs.

[^ 1]: J'écrirai un article séparé sur les nouveaux éléments.

Dans l'ensemble, les changements n'ont pas beaucoup changé dans l'esprit de chaque élément, sauf que les risques de sécurité liés à la sérialisation sont devenus plus prononcés. De plus, la grammaire et les API standard Java 7 et ultérieures ont été ajoutées pour améliorer l'écriture, et le format du document a été modifié en conséquence.

Parmi les outils introduits, j'ai pensé que Java Microbenchmark Harness pourrait être utile. (Je ne l'ai pas bien vérifié ...) http://openjdk.java.net/projects/code-tools/jmh/ La liste des articles est http://www.informit.com/store/effective-java-9780134685991 , Obtenu à partir d'un échantillon de contenu.

Chapter 2: Creating and Destroying Objects

Item 1: Consider static factory methods instead of constructors

Item 2: Consider a builder when faced with many constructor parameters

--Ajout d'un générateur d'exemple avec une hiérarchie de classes à l'aide du paramètre de type récursif (Item30).

Item 3: Enforce the singleton property with a private constructor or an enum type

Item 4: Enforce noninstantiability with a private constructor

――Il n'y a pas de changement de caractéristique particulier.

Item 5: Prefer dependency injection to hardwiring resources

Nouvel article

Item 6: Avoid creating unnecessary objects

--L'exemple de code a été changé en un utilisant RegEx. (Peut-être que je ne voulais pas donner un exemple de Calander ou de Date.)

Item 7: Eliminate obsolete object references

――Il n'y a pas de changement de caractéristique particulier.

Item 8: Avoid finalizers and cleaners

Item 9: Prefer try-with-resources to try-finally

Nouvel article.

Chapter 3: Methods Common to All Objects

Item 10: Obey the general contract when overriding equals

Item 11: Always override hashCode when you override equals

--L'exemple de classe PhoneNumber a changé pour la configuration décrite dans l'élément 10. --Il est maintenant recommandé d'utiliser Type.hashcode (f) pour générer des valeurs de hachage. --Il montre également comment utiliser la classe de hachage de Guava. https://github.com/google/guava/wiki/HashingExplained --Il a été souligné de ne pas fournir de spécifications détaillées pour le hashcode.

Item 12: Always override toString

Item 13: Override clone judiciously

Item 14: Consider implementing Comparable

--Dans l'implémentation de compareTo (), plutôt que d'utiliser l'opérateur de comparaison, une méthode statique compare () a été ajoutée à la classe wrapper de chaque type primitif, il est donc maintenant recommandé de l'utiliser. Double.compare () Float.compare () etc.

Chapter 4: Classes and Interfaces

Item 15: Minimize the accessibility of classes and members

--Ajout de 4 paragraphes de P76 sur le système de module Java9.

Item 16: In public classes, use accessor methods, not public fields

Il n'y a pas de changement de caractéristique particulier.

Item 17: Minimize mutability

Item 18: Favor composition over inheritance

Il n'y a pas de changement de caractéristique particulier.

Item 19: Design and document for inheritance or else prohibit it

Item 20: Prefer interfaces to abstract classes

Item 21: Design interfaces for posterity

Nouvel article

―― Concevons l'interface du futur.

Item 22: Use interfaces only to define types

-Ajout de la possibilité d'écrire des littéraux numériques séparés par des traits de soulignement.

Item 23: Prefer class hierarchies to tagged classes

Il n'y a aucun changement dans le contenu global.

Item 24: Favor static member classes over nonstatic

Item 25: Limit source files to a single top-level class

Nouvel article.

Chapter 5: Generics

Item 26: Don’t use raw types

Item 27: Eliminate unchecked warnings

Item 28: Prefer lists to arrays

Item 29: Favor generic types

Item 30: Favor generic methods

Item 31: Use bounded wildcards to increase API flexibility

Item 32: Combine generics and varargs judiciously

Nouvel article.

Item 33: Consider typesafe heterogeneous containers

Chapter 6: Enums and Annotations

Item 34: Use enums instead of int constants

--Ajout d'un paragraphe sur le comportement lorsque la valeur de Enum est supprimée.

Item 35: Use instance fields instead of ordinals

Item 36: Use EnumSet instead of bit fields

Item 37: Use EnumMap instead of ordinal indexing

Item 38: Emulate extensible enums with interfaces

Item 39: Prefer annotations to naming patterns

--Un paragraphe a été ajouté pour expliquer un exemple de Java8 utilisant la méthode d'écriture de la même annotation plusieurs fois (annotation @ Repeatable).

Item 40: Consistently use the Override annotation

Item 41: Use marker interfaces to define types

Chapter 7: Lambdas and Streams

Nouveau chapitre! Non couvert dans cet article.

Chapter 8: Methods

Item 49: Check parameters for validity

Item 50: Make defensive copies when needed

Item 51: Design method signatures carefully

Item 52: Use overloading judiciously

「inexact method reference」

Référence: https://mjg123.github.io/2017/10/23/Java-Inexact-Method-References.html

Item 53: Use varargs judiciously

Item 54: Return empty collections or arrays, not nulls

――Le développement de l'histoire est devenu une structure dans laquelle la collection sort avant le tableau.

Item 55: Return optionals judiciously

Nouvel article. Je vais l'omettre dans cet article.

Item 56: Write doc comments for all exposed API elements

Il n'y a pas de changement dans la demande globale, mais divers ajouts ont été faits.

(Je serai peut-être reconnaissant de savoir comment rédiger le document.)

Chapter 9: General Programming

Item 57: Minimize the scope of local variables

Il n'y a aucun changement dans le contenu global.

Item 58: Prefer for-each loops to traditional for loops

Item 59: Know and use the libraries

Item 60: Avoid float and double if exact answers are required

--Dans la description de la source de l'échantillon, il est ajouté qu'un constructeur qui prend une chaîne comme argument est utilisé afin qu'une valeur précise puisse être saisie.

Item 61: Prefer primitive types to boxed primitives

Il n'y a pas de changement dans l'objectif général.

Item 62: Avoid strings where other types are more appropriate

Il n'y a pas de changement dans l'objectif général.

Item 63: Beware the performance of string concatenation

Il n'y a pas de changement dans l'objectif général.

Item 64: Refer to objects by their interfaces

Item 65: Prefer interfaces to reflection

―― Le paragraphe «En règle générale, les applications normales ne doivent pas accéder aux objets par réflexion lors de l'exécution» a été supprimé. (Parce que la ligne entre normal et inhabituel est floue?)

Item 66: Use native methods judiciously

Item 67: Optimize judiciously

Item 68: Adhere to generally accepted naming conventions

Chapter 10: Exceptions

Item 69: Use exceptions only for exceptional conditions

Item 70: Use checked exceptions for recoverable conditions and runtime exceptions for programming errors

Item 71: Avoid unnecessary use of checked exceptions

Item 72: Favor the use of standard exceptions

Item 73: Throw exceptions appropriate to the abstraction

Item 74: Document all exceptions thrown by each method

Item 75: Include failure-capture information in detail messages

Item 76: Strive for failure atomicity

Item 77: Don’t ignore exceptions

--Ajout du contenu de ʻignored` comme nom de variable lorsque l'exception est intentionnellement ignorée.

Chapter 11: Concurrency

Item 78: Synchronize access to shared mutable data

--java.util.concurrent.atmic La description du package a été ajoutée petite.

Item 79: Avoid excessive synchronization

Item 80: Prefer executors, tasks, and streams to threads

Item 81: Prefer concurrency utilities to wait and notify

Item 82: Document thread safety

――Il y a quelques ajouts mineurs, mais il n'y a pas de changement dans l'objectif général.

Item 83: Use lazy initialization judiciously

Item 84: Don’t depend on the thread scheduler

Il n'y a pas de changement dans l'objectif général.

Chapter 12: Serialization

Item 85: Prefer alternatives to Java serialization

Nouvel article

――Le contenu de ce chapitre dans son ensemble ne recommande pas la sérialisation. C'est un paragraphe comme l'explication du plan. ―― "La sérialisation est dangereuse et doit être évitée. Pour les nouveaux systèmes, utilisez JSON ou Protocol Buffers."

Item 86: Implement Serializable with great caution

Item 87: Consider using a custom serialized form

Item 88: Write readObject methods defensively

Item 89: For instance control, prefer enum types to readResolve

Item 90: Consider serialization proxies instead of serialized instances

Il n'y a pas de changement dans l'objectif général.

À la fin

Les dates de sortie de chaque édition sont les suivantes.

Numéro de version Date de sortie Lien de référence
1ère édition 2001-06-15 http://amzn.asia/j2dqKSw
2e édition 2008-05-08 http://amzn.asia/6lVZFi4
3e édition 2018-01-06 http://amzn.asia/hI5g2sy

La prochaine édition effective de Java 4e devrait être prévue pour 2027, soit environ 9 ans plus tard. La version Java à ce moment-là devrait être 30 selon le modèle de version actuel [^ 2], et je ne peux pas imaginer quelles nouvelles fonctionnalités il a. Rendez-vous tous dans 9 ans. (N'est-il plus écrit?)

Recommended Posts

Ce qui a changé entre la 2e édition effective de Java et la 3e édition
Enum et annotations du chapitre 6 de Java 3rd Edition efficace
Efficace Java 3e édition Chapitre 7 Lambda et Stream
Effective Java 3rd Edition Chapitre 2 Création et disparition d'objets
Efficacité de Java 3rd Edition Chapitre 5 Génériques
Méthodes efficaces du chapitre 8 de Java 3rd Edition
Effective Java 3rd Edition Chapitre 9 Programme Général
3ème résumé efficace de Java
Efficacité de Java 3rd Edition Section 85 Choix d'une alternative à la sérialisation Java
Mises à jour des notes personnelles en vigueur de Java Third Edition 2nd Edition
Efficace Java 3rd Edition Chapitre 3 Méthodes communes à tous les objets
J'écrirai un extrait de ce que j'ai trouvé intéressant en lisant Effective Java 3rd Edition
[Java] Différence entre == et égal
[Java] Quelle est la différence entre form, entity et dto? [Haricot]
Différences entre Java "débutant" et Kotlin
[Java] Différence entre Hashmap et HashTable
[JAVA] Différence entre abstrait et interface
[Java] Relation entre H2DB et JDBC
[Java] Différence entre array et ArrayList
Différences entre Java et .NET Framework
[Java] Différence entre fermable et fermable automatiquement
[Java] Différence entre StringBuffer et StringBuilder
[Java] Différence entre longueur, longueur () et taille ()
[Java] Que sont les remplacements et les surcharges?
Conversion entre Kotlin nullable et Java facultative
Relation entre les modificateurs d'accès kotlin et java
Différence entre final et immuable en Java
[Pour les débutants] Différence entre Java et Kotlin
[Java] Différences entre les variables d'instance et les variables de classe
Qu'est-ce que Java et l'environnement de développement (MAC)
[Note] Coopération entre Java et DB (basique)
[Java] Différence entre la plage Intstream et la plageClosed
Différence entre int et Integer en Java
HashMap # putAll () se comporte différemment entre Java 7 et Java 8