Nachdem ich die versteckten Funktionen von C # gelesen hatte, fragte ich mich: Was sind einige der versteckten Funktionen von Java?
295
Nachdem ich die versteckten Funktionen von C # gelesen hatte, fragte ich mich: Was sind einige der versteckten Funktionen von Java?
Antworten:
Die Doppelklammer-Initialisierung hat mich vor einigen Monaten überrascht, als ich sie zum ersten Mal entdeckte und noch nie davon gehört habe.
ThreadLocals sind normalerweise nicht so weit verbreitet, um den Status pro Thread zu speichern.
Da in JDK 1.5 Java äußerst gute und robuste Parallelitätstools vorhanden sind, die über Sperren hinausgehen, befinden sie sich in java.util.concurrent. Ein besonders interessantes Beispiel ist das Unterpaket java.util.concurrent.atomic , das thread-sichere Grundelemente enthält, die den Vergleich implementieren -und-Swap- Vorgang und kann tatsächlichen nativen hardwareunterstützten Versionen dieser Vorgänge zugeordnet werden.
quelle
Gemeinsame Vereinigung in der Varianz der Typparameter:
Wenn Sie beispielsweise einen Parameter verwenden möchten, der sowohl vergleichbar als auch eine Sammlung ist:
Diese erfundene Methode gibt true zurück, wenn die beiden angegebenen Sammlungen gleich sind oder wenn eine von ihnen das angegebene Element enthält, andernfalls false. Beachten Sie, dass Sie für die Argumente b1 und b2 Methoden von Comparable und Collection aufrufen können.
quelle
Ich war neulich von Instanzinitialisierern überrascht. Ich habe einige Code-Folded-Methoden gelöscht und am Ende mehrere Instanzinitialisierer erstellt:
Wenn Sie die
main
Methode ausführen , wird Folgendes angezeigt:Ich denke, diese wären nützlich, wenn Sie mehrere Konstruktoren hätten und gemeinsamen Code benötigen würden
Sie bieten auch syntaktischen Zucker zum Initialisieren Ihrer Klassen:
quelle
JDK 1.6_07 + enthält eine App namens VisualVM (bin / jvisualvm.exe), die eine nette GUI über vielen Tools ist. Es scheint umfassender als JConsole.
quelle
Platzhalter für Klassenpfade seit Java 6.
Anstatt
Siehe http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html
quelle
Für die meisten Leute, die ich für Java-Entwicklerpositionen interviewe, sind mit Blöcken gekennzeichnete Blöcke sehr überraschend. Hier ist ein Beispiel:
Wer hat
goto
in Java gesagt, ist nur ein Schlüsselwort? :) :)quelle
Wie wäre es mit kovarianten Rückgabetypen, die seit JDK 1.5 vorhanden sind? Es ist ziemlich schlecht bekannt, da es eine unsexy Ergänzung ist, aber wie ich es verstehe, ist es absolut notwendig, dass Generika funktionieren.
Im Wesentlichen erlaubt der Compiler jetzt einer Unterklasse, den Rückgabetyp einer überschriebenen Methode auf eine Unterklasse des Rückgabetyps der ursprünglichen Methode zu beschränken. Das ist also erlaubt:
Sie können die die Unterklasse aufrufen
values
Verfahren und eine sortierte Thread - sicher erhaltenSet
vonString
s , ohne nach unten gegossen, die auf dieConcurrentSkipListSet
.quelle
Die Übertragung der Kontrolle in einem finally-Block wirft jede Ausnahme weg. Der folgende Code löst keine RuntimeException aus - er geht verloren.
Von http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
quelle
Ich habe noch niemanden gesehen, der eine Instanz der Implementierung so erwähnt hat, dass eine Überprüfung auf Null nicht erforderlich ist.
Anstatt:
benutz einfach:
quelle
free
ing oderdelete
ing in C / C ++. Solch ein grundlegendes Konzept.Das Zulassen von Methoden und Konstruktoren in Aufzählungen hat mich überrascht. Zum Beispiel:
Sie können sogar einen "konstanten spezifischen Klassenkörper" haben, der es einem bestimmten Enum-Wert ermöglicht, Methoden zu überschreiben.
Weitere Dokumentation hier .
quelle
mAge
sollte endgültig sein. Es gibt selten einen Grund für nicht endgültige Felder in Aufzählungen.Die Typparameter für generische Methoden können explizit wie folgt angegeben werden:
quelle
public static <T> T foo(T t)
. Sie können dann anrufenClass.<Type>foo(t);
return set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList()
. Dies ist auch nützlich für einige Methodenaufrufe, bei denen eine einfache Collections.emptyMap () einen Kompilierungsfehler ergibt.Sie können Aufzählungen verwenden, um eine Schnittstelle zu implementieren.
EDIT: Jahre später ....
Ich benutze diese Funktion hier
https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java
Mithilfe einer Schnittstelle können Entwickler ihre eigenen Strategien definieren. Mit einem
enum
Mittel kann ich eine Sammlung von fünf integrierten definieren.quelle
Ab Java 1.5 verfügt Java nun über eine viel sauberere Syntax zum Schreiben von Funktionen mit variabler Arität. Anstatt nur ein Array zu übergeben, können Sie jetzt Folgendes tun
Balken werden automatisch in ein Array des angegebenen Typs konvertiert. Kein großer Gewinn, aber dennoch ein Gewinn.
quelle
Mein Favorit: Alle Thread-Stack-Traces auf Standard ausgeben.
Windows: CTRL- BreakIn Ihrem Java-Cmd / Konsolenfenster
Unix:
kill -3 PID
quelle
Break
Taste hat.Einige Leute haben über Instanzinitialisierer geschrieben. Hier ist eine gute Verwendung dafür:
Ist eine schnelle Möglichkeit, Karten zu initialisieren, wenn Sie nur schnell und einfach etwas tun.
Oder verwenden Sie es, um einen schnellen Swing-Frame-Prototyp zu erstellen:
Natürlich kann es missbraucht werden:
quelle
Mit dynamischen Proxys (hinzugefügt in 1.3) können Sie zur Laufzeit einen neuen Typ definieren, der einer Schnittstelle entspricht. Es hat sich überraschend oft als nützlich erwiesen.
quelle
Die endgültige Initialisierung kann verschoben werden.
Es stellt sicher, dass auch bei einem komplexen Fluss logischer Rückgabewerte immer Werte festgelegt werden. Es ist zu leicht, einen Fall zu übersehen und versehentlich null zurückzugeben. Es macht es nicht unmöglich, null zurückzugeben, nur offensichtlich, dass es absichtlich ist:
quelle
Ich denke, ein weiteres "übersehenes" Feature von Java ist die JVM selbst. Es ist wahrscheinlich die beste verfügbare VM. Und es unterstützt viele interessante und nützliche Sprachen (Jython, JRuby, Scala, Groovy). Alle diese Sprachen können einfach und nahtlos zusammenarbeiten.
Wenn Sie eine neue Sprache entwerfen (wie im Scala-Fall), stehen Ihnen sofort alle vorhandenen Bibliotheken zur Verfügung, und Ihre Sprache ist daher von Anfang an "nützlich".
Alle diese Sprachen nutzen die HotSpot-Optimierungen. Die VM ist sehr gut zu überwachen und zu debuggen.
quelle
Sie können eine anonyme Unterklasse definieren und direkt eine Methode darauf aufrufen, auch wenn keine Schnittstellen implementiert sind.
quelle
start()
) aufgerufen wird, nicht in der Unterklasse definiert ...Die asList- Methode in
java.util.Arrays
ermöglicht eine schöne Kombination von Varargs, generischen Methoden und Autoboxing:quelle
Arrays.asList
hat die ungewöhnliche Funktion, dass Sieset()
Elemente aber nichtadd()
oder könnenremove()
. Daher wickle ich es normalerweise in einnew ArrayList(...)
oder in einCollections.unmodifiableList(...)
, je nachdem, ob die Liste geändert werden soll oder nicht.Verwenden dieses Schlüsselworts für den Zugriff auf Felder / Methoden zum Enthalten von Klassen aus einer inneren Klasse. Im folgenden, eher konstruierten Beispiel möchten wir das sortAscending-Feld der Containerklasse aus der anonymen inneren Klasse verwenden. Die Verwendung von ContainerClass.this.sortAscending anstelle von this.sortAscending reicht aus.
quelle
MyActivity.this
.Nicht wirklich eine Funktion, aber ein amüsanter Trick, den ich kürzlich auf einer Webseite entdeckt habe:
ist ein gültiges Java-Programm (obwohl es eine Warnung generiert). Wenn Sie nicht verstehen, warum, lesen Sie Gregorys Antwort! ;-) Nun, die Syntaxhervorhebung hier gibt auch einen Hinweis!
quelle
Dies ist nicht gerade "versteckte Funktionen" und nicht sehr nützlich, kann aber in einigen Fällen äußerst interessant sein:
Klasse sun.misc.Unsafe - ermöglicht die Implementierung der direkten Speicherverwaltung in Java (Sie können sogar selbstmodifizierenden Java-Code mit schreiben dies, wenn Sie viel versuchen):
quelle
Wenn ich in Swing arbeite, mag ich die versteckte Ctrl- Shift- F1Funktion.
Der Komponentenbaum des aktuellen Fensters wird ausgegeben.
(Angenommen, Sie haben diesen Tastendruck nicht an etwas anderes gebunden.)
quelle
Jede Klassendatei beginnt mit dem Hex-Wert 0xCAFEBABE , um sie als gültigen JVM-Bytecode zu identifizieren.
( Erklärung )
quelle
Meine Stimme geht an java.util.concurrent mit seinen gleichzeitigen Sammlungen und flexiblen Ausführenden, die unter anderem Thread-Pools, geplante Aufgaben und koordinierte Aufgaben ermöglichen. Die DelayQueue ist mein persönlicher Favorit, bei dem Elemente nach einer bestimmten Verzögerung verfügbar gemacht werden.
java.util.Timer und TimerTask können sicher zur Ruhe gesetzt werden.
Auch nicht genau versteckt, sondern in einem anderen Paket als die anderen Klassen in Bezug auf Datum und Uhrzeit. java.util.concurrent.TimeUnit ist nützlich beim Konvertieren zwischen Nanosekunden, Mikrosekunden, Millisekunden und Sekunden.
Es liest sich viel besser als der übliche someValue * 1000 oder someValue / 1000.
quelle
CountDownLatch
undCyclicBarrier
- so nützlich!Sprachebene assert Stichwort.
quelle
Nicht wirklich Teil der Java-Sprache, aber der Javap-Disassembler, der mit Suns JDK geliefert wird, ist nicht allgemein bekannt oder wird nicht verwendet.
quelle
Die Hinzufügung des for-each-Schleifenkonstrukts in 1.5. Ich <3 es.
Und kann in verschachtelten Instanzen verwendet werden:
Das for-each-Konstrukt gilt auch für Arrays, in denen die Indexvariable und nicht der Iterator ausgeblendet werden. Die folgende Methode gibt die Summe der Werte in einem int-Array zurück:
Link zur Sun-Dokumentation
quelle
i
hier ist sehr verwirrend, da die meisten Leute erwarten, dass ich ein Index und nicht das Array-Element bin .Ich persönlich habe es
java.lang.Void
sehr spät entdeckt - verbessert die Lesbarkeit des Codes in Verbindung mit Generika, zCallable<Void>
quelle