Après avoir lu les fonctionnalités cachées de C #, je me suis demandé, quelles sont certaines des fonctionnalités cachées de Java?
295
Après avoir lu les fonctionnalités cachées de C #, je me suis demandé, quelles sont certaines des fonctionnalités cachées de Java?
Réponses:
L'initialisation de Double Brace m'a pris par surprise il y a quelques mois lorsque je l'ai découvert pour la première fois, je n'en avais jamais entendu parler auparavant.
Les ThreadLocals ne sont généralement pas aussi largement connus comme moyen de stocker l'état par thread.
Étant donné que JDK 1.5 Java a eu des outils de concurrence extrêmement bien mis en œuvre et robustes au-delà des seuls verrous, ils vivent dans java.util.concurrent et un exemple particulièrement intéressant est le sous- package java.util.concurrent.atomic qui contient des primitives thread-safe qui implémentent la comparaison -et-swap opération et peut mapper vers des versions natives prises en charge par le matériel de ces opérations.
la source
Union conjointe dans la variance des paramètres de type:
Par exemple, si vous vouliez prendre un paramètre à la fois comparable et collection:
Cette méthode artificielle renvoie vrai si les deux collections données sont égales ou si l'une d'entre elles contient l'élément donné, sinon false. Le point à noter est que vous pouvez invoquer les méthodes de Comparable et Collection sur les arguments b1 et b2.
la source
L'autre jour, j'ai été surpris par les initialiseurs d'instance. Je supprimais certaines méthodes repliées dans le code et j'ai fini par créer plusieurs initialiseurs d'instance:
L'exécution de la
main
méthode affichera:Je suppose que cela serait utile si vous aviez plusieurs constructeurs et aviez besoin d'un code commun
Ils fournissent également du sucre syntaxique pour initialiser vos cours:
la source
JDK 1.6_07 + contient une application appelée VisualVM (bin / jvisualvm.exe) qui est une belle interface graphique au-dessus de nombreux outils. Il semble plus complet que JConsole.
la source
Caractères génériques Classpath depuis Java 6.
Au lieu de
Voir http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html
la source
Pour la plupart des gens que j'interviewe pour les postes de développeurs Java, les blocs étiquetés sont très surprenants. Voici un exemple:
Qui a dit
goto
en java n'est qu'un mot-clé? :)la source
Qu'en est-il des types de retour covariants qui sont en place depuis JDK 1.5? Il est assez mal publicisé, car il s'agit d'un ajout non sexy, mais si je comprends bien, il est absolument nécessaire que les génériques fonctionnent.
Essentiellement, le compilateur permet désormais à une sous-classe d'affiner le type de retour d'une méthode redéfinie pour être une sous-classe du type de retour de la méthode d'origine. Donc c'est permis:
Vous pouvez appeler la
values
méthode de la sous-classe et obtenir un thread trié sûrSet
deString
s sans avoir à effectuer de conversion vers leConcurrentSkipListSet
.la source
Le transfert de contrôle dans un bloc enfin annule toute exception. Le code suivant ne lève pas RuntimeException - il est perdu.
Depuis http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
la source
Personne n'a mentionné l'instance de mise en œuvre de telle manière que la vérification de null n'est pas nécessaire.
Au lieu de:
utilisez simplement:
la source
free
ing oudelete
ing en C / C ++. Un tel concept fondamental.Autoriser les méthodes et les constructeurs dans les énumérations m'a surpris. Par exemple:
Vous pouvez même avoir un "corps de classe spécifique constant" qui permet à une valeur d'énumération spécifique de remplacer les méthodes.
Plus de documentation ici .
la source
mAge
devrait être définitive. Il y a rarement une raison pour les champs non finaux dans les énumérations.Les paramètres de type pour les méthodes génériques peuvent être spécifiés explicitement comme ceci:
la source
public static <T> T foo(T t)
. Vous pouvez ensuite téléphoner àClass.<Type>foo(t);
return set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList()
. Il est également utile pour certaines invocations de méthodes où un simple Collections.emptyMap () donnerait une erreur de compilation.Vous pouvez utiliser des énumérations pour implémenter une interface.
EDIT: Des années plus tard ....
J'utilise cette fonctionnalité ici
https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java
En utilisant une interface, les développeurs peuvent définir leurs propres stratégies. En utilisant un
enum
moyen, je peux définir une collection (de cinq) intégrée.la source
Depuis Java 1.5, Java a maintenant une syntaxe beaucoup plus propre pour écrire des fonctions d'arité variable. Donc, au lieu de simplement passer un tableau, vous pouvez maintenant faire ce qui suit
bars est automatiquement converti en tableau du type spécifié. Pas une énorme victoire, mais une victoire néanmoins.
la source
Mon préféré: vider toutes les traces de pile de threads en sortie standard.
les fenêtres: CTRL - Breakdans votre fenêtre java cmd / console
unix:
kill -3 PID
la source
Break
touche.Quelques personnes ont posté sur les initialiseurs d'instance, en voici une bonne utilisation:
Est un moyen rapide d'initialiser des cartes si vous faites quelque chose de simple et rapide.
Ou en l'utilisant pour créer un prototype de cadre pivotant rapide:
Bien sûr, il peut être abusé:
la source
Les proxys dynamiques (ajoutés en 1.3) vous permettent de définir un nouveau type lors de l'exécution qui soit conforme à une interface. C'est utile un nombre surprenant de fois.
la source
l'initialisation finale peut être différée.
Il s'assure que même avec un flux complexe de valeurs de retour logiques sont toujours définies. Il est trop facile de rater un cas et de retourner nul par accident. Cela ne rend pas impossible le retour de null, juste évident que c'est intentionnel:
la source
Je pense qu'une autre caractéristique "négligée" de java est la JVM elle-même. C'est probablement la meilleure machine virtuelle disponible. Et il prend en charge de nombreux langages intéressants et utiles (Jython, JRuby, Scala, Groovy). Toutes ces langues peuvent coopérer facilement et de manière transparente.
Si vous concevez une nouvelle langue (comme dans le cas scala), vous avez immédiatement toutes les bibliothèques existantes disponibles et votre langue est donc "utile" dès le début.
Toutes ces langues utilisent les optimisations HotSpot. La VM est très bien surveillée et débogable.
la source
Vous pouvez définir une sous-classe anonyme et appeler directement une méthode dessus, même si elle n'implémente aucune interface.
la source
start()
) n'est pas réellement définie dans la sous-classe ...La méthode asList de
java.util.Arrays
permet une belle combinaison de varargs, de méthodes génériques et d'autoboxing:la source
Arrays.asList
a la particularité que vous pouvezset()
éléments mais pasadd()
ouremove()
. Je l'enveloppe donc généralement dans unnew ArrayList(...)
ou dans unCollections.unmodifiableList(...)
, selon que je souhaite que la liste soit modifiable ou non.Utiliser ce mot - clé pour accéder aux champs / méthodes de confinement d'une classe à partir d'une classe interne. Dans l'exemple ci-dessous, plutôt artificiel, nous voulons utiliser le champ sortAscending de la classe de conteneur de la classe interne anonyme. L'utilisation de ContainerClass.this.sortAscending au lieu de this.sortAscending fait l'affaire.
la source
MyActivity.this
.Pas vraiment une fonctionnalité, mais une astuce amusante que j'ai découverte récemment dans une page Web:
est un programme Java valide (bien qu'il génère un avertissement). Si vous ne voyez pas pourquoi, voyez la réponse de Gregory! ;-) Eh bien, la mise en évidence de la syntaxe ici donne également un indice!
la source
Ce ne sont pas exactement des "fonctionnalités cachées" et pas très utiles, mais cela peut être extrêmement intéressant dans certains cas:
Classe sun.misc.Unsafe - vous permettra d'implémenter une gestion directe de la mémoire en Java (vous pouvez même écrire du code Java auto-modifiable avec ceci si vous essayez beaucoup):
la source
Quand je travaille dans Swing, j'aime le caché Ctrl- Shift-F1 .
Il vide l'arborescence des composants de la fenêtre actuelle.
(En supposant que vous n'avez pas lié cette frappe à autre chose.)
la source
Chaque fichier de classe commence par la valeur hexadécimale 0xCAFEBABE pour l'identifier en tant que bytecode JVM valide.
( Explication )
la source
Mon vote va à java.util.concurrent avec ses collections simultanées et ses exécuteurs flexibles permettant entre autres des pools de threads, des tâches planifiées et des tâches coordonnées. Le DelayQueue est mon préféré, où les éléments sont mis à disposition après un délai spécifié.
java.util.Timer et TimerTask peuvent être arrêtés en toute sécurité.
En outre, pas exactement caché mais dans un package différent des autres classes liées à la date et à l'heure. java.util.concurrent.TimeUnit est utile lors de la conversion entre nanosecondes, microsecondes, millisecondes et secondes.
Il se lit beaucoup mieux que la valeur habituelle someValue * 1000 ou someValue / 1000.
la source
CountDownLatch
etCyclicBarrier
- si utile!Mot clé d' assertion au niveau de la langue .
la source
Ne fait pas vraiment partie du langage Java, mais le désassembleur javap fourni avec le JDK de Sun n'est pas largement connu ou utilisé.
la source
L'ajout de la construction de boucle for-each en 1.5. Je le <3.
Et peut être utilisé dans des instances imbriquées:
La construction for-each s'applique également aux tableaux, où elle masque la variable d'index plutôt que l'itérateur. La méthode suivante renvoie la somme des valeurs d'un tableau int:
Lien vers la documentation Sun
la source
i
ici est très déroutante, car la plupart des gens s'attendent à ce que je sois un index et non l'élément de tableau.personnellement, j'ai découvert
java.lang.Void
très tard - améliore la lisibilité du code en conjonction avec les génériques, par exempleCallable<Void>
la source