Para los desarrolladores de C # que quieren aprender Java, ¿hay grandes diferencias subyacentes entre los dos lenguajes que deberían ser señaladas?
Quizás algunas personas asuman que las cosas son iguales, pero ¿hay algunos aspectos importantes que no deben pasarse por alto? (¡O realmente puedes arruinarlo!)
Tal vez en términos de construcciones de OOP, la forma en que funciona GC, referencias, implementación relacionada, etc.
Respuestas:
Algunas trampas de mi cabeza:
byte
está firmado en Java (desafortunadamente)static
, tendrá una referencia implícita a una instancia de la clase contenedora.fuente
aquí hay una comparación muy completa de los 2 idiomas:
http://www.25hoursaday.com/CsharpVsJava.html
Añadido: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
fuente
Me sorprende que nadie haya mencionado propiedades, algo bastante fundamental en C # pero ausente en Java. C # 3 y superior también ha implementado propiedades automáticamente. En Java tienes que usar métodos de tipo GetX / SetX.
Otra diferencia obvia son las expresiones LINQ y lambda en C # 3 ausentes en Java.
Hay algunas otras cosas simples pero útiles que faltan en Java como cadenas textuales (@ ""), sobrecarga de operadores, iteradores que usan rendimiento y preprocesador que también faltan en Java.
Uno de mis favoritos personales en C # es que los nombres de los espacios de nombres no tienen que seguir la estructura del directorio físico. Realmente me gusta esta flexibilidad.
fuente
Hay muchas diferencias, pero estas me vienen a la mente:
fuente
.equals
es lo que tienes que usar..NET tiene genéricos reificados; Java ha borrado los genéricos.
La diferencia es la siguiente: si tiene un
ArrayList<String>
objeto, en .NET, puede decir (en tiempo de ejecución) que el objeto tiene tipoArrayList<String>
, mientras que en Java, en tiempo de ejecución, el objeto es de tipoArrayList
; laString
parte se pierde. Si ingresa noString
objetos en elArrayList
, el sistema no puede hacer cumplir eso, y solo lo sabrá después de que intente extraer el elemento y el lanzamiento falle.fuente
String
objetos en esa lista sin hacer una conversión sin marcar, en algún lugar , y el compilador le advertirá correctamente en ese punto que el compilador ya no puede verificar los límites genéricos. Siempre que su lista esté siempre almacenada en una variable deList<String>
, los intentos de insertar un objeto que no sea String no se compilarán.add
método (nuevamente, a través de la reflexión). ¿Rechazará el sistema un noString
objeto de inmediato, o solo al emitir el resultado deget
?List
. Puede tener objetos de tipos que desciendan deList
, comoArrayList
yLinkedList
. (Es importante usarlo enList
lugar deArrayList
pasarlos, pero no cambia el hecho de que no se puede decirnew List()
).Una cosa que extraño en C # de Java es el manejo forzado de excepciones marcadas. En C #, ¿es demasiado común que uno desconozca las excepciones que puede generar un método y que esté a merced de la documentación o las pruebas para descubrirlas? No es así en Java con excepciones marcadas.
fuente
Java tiene autoboxing para primitivas en lugar de tipos de valor, por lo que, aunque
System.Int32[]
es una matriz de valores en C #,Integer[]
es una matriz de referencias aInteger
objetos y, como tal, no es adecuada para cálculos de mayor rendimiento.fuente
Sin delegados ni eventos, debe usar interfaces. Afortunadamente, puede crear clases e implementaciones de interfaz en línea, por lo que esto no es tan importante.
fuente
x => x.Foo
vs.new Bar() { public void M(SomeType x) { return x.Foo; } }
- ¿a quién le importa que el código sea 10 veces más corto?La funcionalidad de fecha / calendario incorporada en Java es horrible en comparación con System.DateTime. Hay mucha información sobre esto aquí: ¿Qué pasa con la API de fecha y hora de Java?
Algunos de estos pueden ser trucos para un desarrollador de C #:
Además, Java no tiene todas las mismas características que traen el GAC y los ensamblados con nombre seguro. Jar Hell es el término para lo que puede salir mal al vincular / hacer referencia a bibliotecas externas.
En lo que respecta al empaquetado / implementación:
fuente
No hay delegados en Java. Por lo tanto, además de todos los beneficios que aportan los delegados, los eventos también funcionan de manera diferente. En lugar de simplemente conectar un método, debe implementar una interfaz y adjuntarla.
fuente
Una cosa que resalta porque está en mi lista de entrevistas es que no hay una "nueva" palabra clave análoga en Java para ocultar métodos y, por lo tanto, ningún compilador advierte "debería poner una nueva aquí". La ocultación accidental del método cuando se pretendía anular conduce a errores.
(editar, por ejemplo) Ejemplo, B deriva de A (usando la sintaxis C #, Java se comporta de la misma manera que la última vez que verifiqué, pero no emite una advertencia del compilador). ¿Se llama al foo de A o al foo de B? (Se llama a A, probablemente sorprendiendo al desarrollador que implementó B).
class A { public void foo() {code} } class B:A { public void foo() {code} } void SomeMethod() { A a = new B(); // variable's type is declared as A, but assigned to an object of B. a.foo(); }
fuente
new
método para ocultar intencionalmente, o no finales, por lo que se anulan en lugar de ocultar.Java no tiene LINQ y la documentación es un infierno. Las interfaces de usuario en Java son difíciles de desarrollar, se pierden todas las cosas buenas que nos dio Microsoft (WPF, WCF, etc.) pero se vuelven "API" difíciles de usar y apenas documentadas.
fuente
El único problema con el que me he encontrado hasta ahora al trabajar con Java procedente de C # son las excepciones y los errores son diferentes.
Por ejemplo, no puede detectar un error de memoria insuficiente utilizando catch (Excepción e).
Consulte lo siguiente para obtener más detalles:
¿Por qué-es-java-lang-outofmemoryerror-java-heap-space-not-capturado
fuente
Ha pasado tanto tiempo desde que estoy en Java, pero las cosas que noté desde el principio en el desarrollo de aplicaciones fueron el modelo de eventos C #, C # arrastrar y soltar frente al uso de Layout Managers en Swing (si está haciendo App Dev) y el manejo de excepciones Java asegurándose de detectar una excepción y C # no es necesario.
fuente
En respuesta a su pregunta muy directa en su título:
"Los desarrolladores de C # que están aprendiendo Java, ¿cuáles son las mayores diferencias que uno puede pasar por alto?"
R: El hecho de que Java es considerablemente más lento en Windows.
fuente
La diferencia más molesta para mí cuando cambio a Java es la declaración de cadena.
en C #
string
(la mayor parte del tiempo) en JavaString
Es bastante simple, pero créeme, ¡te hace perder tanto tiempo cuando tienes el hábito de
s
no hacerloS
!fuente