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
getInstance ()
.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.
Comparator.comparingInt`` Comparator.thenComparing
introduit à partir de Java8.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
TimerTask
dans l'exemple de l'explication de ne pas créer de méthode de réinitialisation a été remplacée par CountDownlatch
. (La classe défectueuse est devenue une alternative.)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
@ implSpec
.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
@ Override
n'est pas requise)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
java.util.Objects
dans Java 9.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.
@implSpec
--Il est pratique d'utiliser @ index
car il apparaîtra dans les suggestions de recherche avec javadoc.module-info.java
(il n'y a pas de contenu détaillé)
--Ajout d'un paragraphe de description sur la fonction pour vérifier si le contenu de cet élément est suivi. Outil JavaDoc, checkstyle, W3C-Validator
--Ajout d'un paragraphe expliquant que vous devez réellement le lire pour voir s'il s'agit d'un document clair selon le contenu de cet élément.@ return
si elle est la même que la description de la méthode.
--Ajout de la description de la fonction de la balise @ code
.(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
Collection # removeIf
peut être utilisée lors du filtrage d'une collection dans les cas où for-each ne peut pas être utilisé. (Cela semble pratique!)Item 59: Know and use the libraries
ThreadLocalRandom
a été ajouté pour la génération de nombres aléatoires.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?)
ReflectiveOperationException
pour les exceptions en réflexion. (Java7
La classe ajoutée. Il convient aux prises multiples. )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
CloneNotSupportedException
a été supprimé.Item 72: Favor the use of standard exceptions
,
RuntimeException,
Throwable, ʻError
ne doivent pas être utilisées directement. ou ʻIllegalArgumentException
pour la sélection des classes d'exception sont maintenant présentés concrètement.Item 73: Throw exceptions appropriate to the abstraction
Item 74: Document all exceptions thrown by each method
main
peut être throws Exception
ou Throwable
.@ throws
.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
java.util.Timer
a été remplacé par le contenu de la tâche fork-join
. (Est-ce une question de largeur et d'importance du papier?)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
defaultWriteObject ()
. (Il doit être appelé selon les spécifications)
--Il est clairement indiqué que l'UID de la version série ne doit pas être modifié à moins que vous ne vouliez intentionnellement créer une incompatibilité.Item 88: Write readObject methods defensively
octet
dans l'exemple de code (puisque les littéraux entiers sont int et vous avez besoin d'un cast explicite pour traiter les nombres supérieurs ou égaux à 128 comme octet
. Il n'est pas nécessaire s'il est inférieur ou égal à. Si le bit le plus significatif exprimé en binaire est «0», il en est de même pour «int» et «octet».)writeUnshared
, readUnshared
(parce que c'était trop maniaque?)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.
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