2010-03-16 9 views
16

Habiendo trabajado principalmente con C#, tiendo a pensar en términos de características C# que no están disponibles en Java. Después de trabajar mucho con Java durante el último año, comencé a descubrir las características de Java que desearía que estuvieran en C#. A continuación hay una lista de las que tengo conocimiento. ¿Alguien puede pensar en otras características del lenguaje Java que una persona con un fondo C# puede no darse cuenta?Características del lenguaje Java que no tienen equivalente en C#

Los artículos http://www.25hoursaday.com/CsharpVsJava.html y http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp dan una lista muy extensa de diferencias entre Java y C#, pero me pregunto si me perdí algo en los (muy) largos artículos. También puedo pensar en una característica (tipo de retorno covariante) que no vi mencionada en ninguno de los artículos.

Limite las respuestas a las funciones de idioma o biblioteca central que no pueden ser implementadas efectivamente por su propio código personalizado o bibliotecas de terceros.

  1. Tipo de retorno covariante: un método puede anularse mediante un método que devuelve un tipo más específico. Es útil cuando se implementa una interfaz o se extiende una clase y se desea que un método de anulación devuelva un tipo más específico para su clase. Esto se puede simular utilizando la implementación explícita de la interfaz en C#, pero no hay un equivalente simple al anular los métodos de clase.

  2. Las enumeraciones son clases: una enumeración es una clase completa en Java, en lugar de una envoltura alrededor de una primitiva como en .Net. Java le permite definir campos y métodos en una enumeración.

  3. Clases internas anónimas: definen una clase anónima que implementa un método. Aunque la mayoría de los casos de uso para esto en Java están cubiertos por los delegados en .Net, hay algunos casos en los que realmente necesita pasar múltiples devoluciones de llamadas como un grupo. Sería bueno tener la opción de usar una clase interna anónima.

  4. Excepciones comprobadas: puedo ver que esto es útil en el contexto de diseños comunes utilizados con aplicaciones Java, pero mi experiencia con .Net me ha dado la costumbre de utilizar excepciones solo para condiciones irrecuperables. ES DECIR. las excepciones indican un error en la aplicación y solo se capturan con el fin de iniciar sesión. Todavía no he llegado a la idea de usar excepciones para el flujo normal de programas.

  5. strictfp - Asegura una aritmética estricta en coma flotante. No estoy seguro de qué tipo de aplicaciones encontraría esto útil.

  6. campos en las interfaces - Es posible declarar los campos en las interfaces. Nunca he usado esto.

  7. importaciones estáticas: permite usar los métodos estáticos de una clase sin calificarlo con el nombre de la clase. Me di cuenta hoy que esta característica existe. Parece una buena conveniencia.

+0

Espero que esto sea una mejora con respecto a mi última versión de esta pregunta (no relevante si no sabes de lo que estoy hablando). Hubo una respuesta que pensé que era bastante buena y podría haber marcado como la respuesta. – jthg

+0

+1 por hacer el esfuerzo de volver a redactar. – spender

+3

Si la característica de falta de propensión a errores es una característica, entonces java no admite 'inseguro', sin embargo, java tiene soporte para jni, que es una ronda sobre el camino :) – questzen

Respuesta

2

Los genéricos de Java permiten el tipo de comodines. Por ejemplo, <T extends Object & Comparable<? super T>> T Collections.max(Collection<? extends T>) { ... } no se puede expresar en C#.

+3

No es una característica, es una solución. – Roman

+1

Definitivamente es una característica. Puede ser una característica necesaria como solución temporal, ya que se necesita alguna otra característica faltante (como clases internas anónimas para compensar el hecho de no tener cierres), pero es una característica, no obstante. – Gabe

+0

Este parece ser el más probable que sea útil. – jthg

2

En C#, no puede tener una declaración de devolución en un bloque finally.

3

Octal literales! : D se emite

int x = 0245; System.out.println(x);


165. Diversión :)

+0

No me di cuenta de esto hasta hoy. Parece que en C# si intentas octals estilo C todo lo que hace es omitir ceros a la izquierda. –

+5

Nunca he visto a nadie usar esta función de Java conscientemente. Pero he visto muchos errores accidentales causados ​​por números enteros con ceros a la izquierda. – Roman

1

No sé si quieres esto en tu idioma, pero supongo que Type Erasure puede ser visto como una característica para algunos.

+0

He visto menciones de Type Erasure como una ventaja, pero nunca he visto una explicación de por qué. ¿Puedes ampliar las ventajas específicas de esto? – jthg

+0

@jthg - bueno, la verdadera ventaja es que no rompe la compatibilidad con versiones anteriores ... – kgrad

+0

No todas las "características" son ventajas. : O –

5

Java tiene paquetes que reflejan una jerarquía y el diseño del sistema de archivos, mientras que en C# los ensamblajes son independientes de la jerarquía del espacio de nombres.

+0

un paquete también es independiente de su classpath. Muy útil para mantener las pruebas separadas del código de implementación, ya que la visibilidad del paquete es suficiente para probar las clases internas y aún así esconderlas de los usuarios. – josefx

Cuestiones relacionadas