Después de leer las características ocultas de C #, me pregunté, ¿cuáles son algunas de las características ocultas de Java?
295
Después de leer las características ocultas de C #, me pregunté, ¿cuáles son algunas de las características ocultas de Java?
Respuestas:
La inicialización de Double Brace me tomó por sorpresa hace unos meses cuando lo descubrí, nunca antes había oído hablar de él.
Los ThreadLocals generalmente no son tan conocidos como una forma de almacenar el estado por hilo.
Dado que JDK 1.5 Java ha tenido herramientas de concurrencia extremadamente bien implementadas y robustas más allá de solo bloqueos, viven en java.util.concurrent y un ejemplo específicamente interesante es el subpaquete java.util.concurrent.atomic que contiene primitivas seguras para subprocesos que implementan la comparación -y-swap y puede correlacionarse con versiones reales de estas operaciones compatibles con hardware nativo.
fuente
Unión conjunta en la varianza del parámetro tipo:
Por ejemplo, si desea tomar un parámetro que sea Comparable y una Colección:
Este método artificial devuelve verdadero si las dos colecciones dadas son iguales o si alguna de ellas contiene el elemento dado, de lo contrario es falso. El punto a tener en cuenta es que puede invocar métodos de Comparable y Collection en los argumentos b1 y b2.
fuente
Me sorprendieron los inicializadores de instancia el otro día. Estaba eliminando algunos métodos de código plegado y terminé creando múltiples inicializadores de instancia:
La ejecución del
main
método mostrará:Supongo que esto sería útil si tuviera múltiples constructores y necesitara un código común
También proporcionan azúcar sintáctico para inicializar tus clases:
fuente
JDK 1.6_07 + contiene una aplicación llamada VisualVM (bin / jvisualvm.exe) que es una buena GUI además de muchas de las herramientas. Parece más completo que JConsole.
fuente
Comodines de Classpath desde Java 6.
En vez de
Ver http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html
fuente
Para la mayoría de las personas que entrevisto para puestos de desarrollador de Java, los bloques etiquetados son muy sorprendentes. Aquí hay un ejemplo:
¿Quién dijo que
goto
en java es solo una palabra clave? :)fuente
¿Qué hay de los tipos de retorno covariantes que han estado vigentes desde JDK 1.5? Está muy poco publicitado, ya que es una adición poco atractiva, pero, según tengo entendido, es absolutamente necesario para que funcionen los genéricos.
Esencialmente, el compilador ahora permite que una subclase limite el tipo de retorno de un método anulado para que sea una subclase del tipo de retorno del método original. Entonces esto está permitido:
Puede llamar al
values
método de la subclase y obtener un subproceso ordenado a salvoSet
deString
s sin tener que bajar la conversión alConcurrentSkipListSet
.fuente
La transferencia de control en un bloque finalmente descarta cualquier excepción. El siguiente código no arroja RuntimeException, se pierde.
De http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
fuente
No he visto a nadie mencionar la instancia de implementación de tal manera que no sea necesario verificar nulo.
En vez de:
Solo usa:
fuente
free
dedelete
ingresar en C / C ++. Un concepto tan fundamental.Permitir métodos y constructores en enumeraciones me sorprendió. Por ejemplo:
Incluso puede tener un "cuerpo de clase específico constante" que permite que un valor enum específico anule los métodos.
Más documentación aquí .
fuente
mAge
debe ser final. Rara vez hay una razón para los tipos no finales en las enumeraciones.Los parámetros de tipo para métodos genéricos se pueden especificar explícitamente de la siguiente manera:
fuente
public static <T> T foo(T t)
. Luego puede hacer llamadas aClass.<Type>foo(t);
return set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList()
. También es útil para algunas invocaciones de métodos donde un simple Collections.emptyMap () daría un error de compilación.Puede usar enumeraciones para implementar una interfaz.
EDITAR: Años después ...
Yo uso esta función aquí
https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java
Al usar una interfaz, los desarrolladores pueden definir sus propias estrategias. Usando un
enum
medio, puedo definir una colección (de cinco) integradas.fuente
A partir de Java 1.5, Java ahora tiene una sintaxis mucho más limpia para escribir funciones de aridad variable. Entonces, en lugar de simplemente pasar una matriz, ahora puede hacer lo siguiente
bars se convierte automáticamente en una matriz del tipo especificado. No es una gran victoria, pero una victoria no obstante.
fuente
Mi favorito: volcar todos los rastros de la pila de hilos a la salida estándar.
windows: CTRL- Breaken su ventana de cmd / consola java
unix:
kill -3 PID
fuente
Break
tecla.Un par de personas han publicado sobre inicializadores de instancias, aquí hay un buen uso:
Es una forma rápida de inicializar mapas si solo está haciendo algo rápido y simple.
O usándolo para crear un prototipo de marco de giro rápido:
Por supuesto que se puede abusar de él:
fuente
Los proxys dinámicos (agregados en 1.3) le permiten definir un nuevo tipo en tiempo de ejecución que se ajusta a una interfaz. Ha sido útil una cantidad sorprendente de veces.
fuente
La inicialización final puede posponerse.
Se asegura de que, incluso con un flujo complejo de lógica, siempre se establezcan valores de retorno. Es demasiado fácil perder un caso y volver nulo por accidente. No hace que la devolución sea nula imposible, solo es obvio que es a propósito:
fuente
Creo que otra característica "pasada por alto" de Java es la propia JVM. Es probablemente la mejor máquina virtual disponible. Y es compatible con muchos idiomas interesantes y útiles (Jython, JRuby, Scala, Groovy). Todos esos idiomas pueden cooperar fácilmente y sin problemas.
Si diseña un nuevo idioma (como en el caso scala), inmediatamente tiene todas las bibliotecas existentes disponibles y, por lo tanto, su idioma es "útil" desde el principio.
Todos esos idiomas hacen uso de las optimizaciones de HotSpot. La VM está muy bien supervisada y puede depurarse.
fuente
Puede definir una subclase anónima y llamar directamente a un método incluso si no implementa interfaces.
fuente
start()
) no está realmente definido en la subclase ...El método asList
java.util.Arrays
permite una buena combinación de varargs, métodos genéricos y autoboxing:fuente
Arrays.asList
tiene la característica inusual que puedaset()
elementos, pero noadd()
oremove()
. Por lo tanto, generalmente lo envuelvo en unnew ArrayList(...)
o en unCollections.unmodifiableList(...)
, dependiendo de si quiero que la lista sea modificable o no.Usar esta palabra clave para acceder a los campos / métodos de contener la clase desde una clase interna. En el ejemplo siguiente, más bien artificial, queremos usar el campo sortAscending de la clase contenedor de la clase interna anónima. Usar ContainerClass.this.sortAscending en lugar de this.sortAscending hace el truco.
fuente
MyActivity.this
.No es realmente una característica, sino un truco divertido que descubrí recientemente en alguna página web:
es un programa Java válido (aunque genera una advertencia). Si no ves por qué, ¡mira la respuesta de Gregory! ;-) Bueno, el resaltado de sintaxis aquí también da una pista.
fuente
Esto no es exactamente "características ocultas" y no es muy útil, pero puede ser extremadamente interesante en algunos casos:
Clase sun.misc.Unsafe - le permitirá implementar la administración directa de memoria en Java (incluso puede escribir código Java auto modificable con esto si intentas mucho):
fuente
Cuando se trabaja en oscilación me gusta la escondida Ctrl- Shift- F1función.
Vuelca el árbol de componentes de la ventana actual.
(Suponiendo que no ha vinculado esa pulsación de tecla a otra cosa).
fuente
Cada archivo de clase comienza con el valor hexadecimal 0xCAFEBABE para identificarlo como código de bytes JVM válido.
( Explicación )
fuente
Mi voto va a java.util.concurrent con sus colecciones concurrentes y ejecutores flexibles que permiten, entre otros, grupos de subprocesos, tareas programadas y tareas coordinadas. El DelayQueue es mi favorito personal, donde los elementos están disponibles después de un retraso específico.
java.util.Timer y TimerTask se pueden poner en reposo de forma segura.
Además, no está exactamente oculto sino en un paquete diferente de las otras clases relacionadas con la fecha y la hora. java.util.concurrent.TimeUnit es útil al convertir entre nanosegundos, microsegundos, milisegundos y segundos.
Se lee mucho mejor que el habitual someValue * 1000 o someValue / 1000.
fuente
CountDownLatch
yCyclicBarrier
- por lo útil!Palabra clave de afirmación a nivel de idioma .
fuente
No es realmente parte del lenguaje Java, pero el desensamblador de Java que viene con JDK de Sun no es ampliamente conocido ni utilizado.
fuente
La adición de la construcción de bucle for-each en 1.5. Yo <3 lo.
Y se puede usar en instancias anidadas:
La construcción para cada también es aplicable a las matrices, donde oculta la variable de índice en lugar del iterador. El siguiente método devuelve la suma de los valores en una matriz int:
Enlace a la documentación de Sun
fuente
i
aquí es muy confuso, ya que la mayoría de la gente espera que yo sea un índice y no el elemento de matriz.Descubrí personalmente
java.lang.Void
muy tarde: mejora la legibilidad del código junto con los genéricos, p. ej.Callable<Void>
fuente