Cambie de C # a Java, ¿qué "problemas" debería importarme?

9

Puede que tenga que cambiar a Java para un nuevo proyecto. Tengo muy poco conocimiento sobre Java, porque principalmente estudié y usé C #, y me temo que las diferencias entre estos dos lenguajes / plataformas probablemente me causen muchos problemas.

¿Cuáles son las trampas / problemas que me deberían importar?

Vimvq1987
fuente
Creo que este blog cubre muchas de las cosas que estás buscando ... ericsink.com/entries/java_eclipse_2.html
Hari Menon
3
Hay muchas diferencias entre C # y Java y cada una de ellas es una "respuesta" potencial a esta pregunta. Sin embargo, dudo que eso sea muy útil para usted u otros. Hacer una pregunta más específica y real produciría respuestas más útiles. Alternativamente, intente pedir referencias o guías para cambiar de C # a Java en lugar de las diferencias (efectivamente infinitas).
En otras palabras, intente hacer una pregunta de "por qué" o "cómo" sobre un problema específico. Por ejemplo, pedir referencias, guías o libros es como preguntar "cómo puedo cambiar de C # a Java", o preguntar sobre un código específico que no entiendes es una pregunta de "por qué esto hace X en lugar de Y".
Considere hacer este wiki comunitario
finnw

Respuestas:

36

Estas son algunas trampas importantes de Java cuando viene de C #:

  • En Java, los switchcasos pueden pasar silenciosamente al siguiente, así que asegúrese de poner siempre que breaksea ​​apropiado. Tampoco se puede switchen Stringen Java.
  • Los genéricos no están reificados y se pueden parametrizar solo con tipos de referencia. No hay List<int>, solo a List<Integer>. Autoboxing oculta la verbosidad, pero se puede obtener NullPointerExceptional desempaquetar a null. Además, ==y !=en dos tipos primitivos en caja, se realiza una comparación de referencia.
    • ... porque ==y !=en dos tipos de referencia (p String. ej. ) siempre hay comparación de referencia
    • Un intse puede autoboxear a un Integer; no hay autoboxing de int[]a Integer[].
  • Java byte, short, int, longsólo están firmados. Esté atento a la extensión de señal no deseada.
  • No hay matrices multidimensionales, solo una matriz de matrices en Java.
  • La mayoría de los sub*métodos de consulta a distancia utilizan el límite inferior inclusivo y el límite superior exclusivo

Ver también

Preguntas relacionadas

Sobre algunos temas enumerados anteriormente:

En las trampas generales de Java:

poligenelubricantes
fuente
8
Ahora puede activar String en Java SE 7.
Malcolm
+1 para Generics no está reificado y parametrizable solo con tipos de referencia , esto me ayudó mucho hoy
cctan
También debe agregar Java no tiene estructuras.
13

Una trampa obvia es comparar cadenas con el estilo C # string1 == string2(Java solo compara referencias) en lugar del estilo Java string1.equals(string2).

Otro privatees el modificador de acceso predeterminado en C #, packageen Java.

Además, los ToString()métodos no están localizados automáticamente por la cultura actual en Java.

Cloudanger
fuente
Esta es una extensión del hecho de que no hay sobrecargas del operador.
Graphain
3
Incorrecto. Package-private es el modificador de acceso predeterminado de Java.
Oliver Weiler
Método @Helper: Oh, lo siento. Quise decir que C # tenía privado como predeterminado, pero no Java. Ahora está editado.
12

El que me sorprendió fue que los argumentos de subcadena de Java son beginIndex, endIndex, mientras que los argumentos de subcadena de C # son startIndex, length. Esa es una diferencia suficiente para hacerlo molesto y una buena probabilidad de sacar el índice de los límites de cualquier manera que cambie.

krock
fuente
3
+1 Más confuso es el hecho de que es beginIndex INCLUSIVE y endIndex EXCLUSIVE ... y que se encuentran algunas API en el JDK que usan startIndex, enfoque de longitud ...
Oliver Weiler
10
  • No obtienes LINQ
  • No obtienes una buena interfaz de usuario (sin WPF)
  • Sin propiedades
  • Te haces bailar egipcios
  • Obtiene API sin ejemplos y buena documentación

Hm.


fuente
2
Nunca encontré la API de Java mala (de hecho, es más fácil de navegar), pero definitivamente hay menos ejemplos. ¿Qué es esto de los egipcios?
Graphain
3
Estoy votando esto ... incluso si es un golpe bajo sarcástico.
mpen
8
¿Son estos verdaderos obstáculos? Entiendo las trampas como posibles causas de errores. Estas son solo cosas con las que tiene que vivir, ya que no puede hacerlo de otra manera.
2
@cloudanger: de acuerdo contigo. Las trampas deberían ser algo que "funcione" incorrectamente, no algo que ni siquiera funciona.
Vimvq1987
10
  • Las enumeraciones de Java son mucho más potentes / complicadas, de hecho son clases reales en lugar de enteros con nombre.
  • Las clases internas en Java son más poderosas (y se comportan de manera diferente)
  • sin delegados, solo objetos funcionales
  • el constructor encadenado tiene una sintaxis completamente diferente en ambos idiomas, tiendo a fallar cada vez que tengo que hacer eso en c #
  • Java tiene extensiones para subclases e implementos para interfaces, lo cual es bastante bueno. C # en su lugar se basa en una convención de nomenclatura que dice que las interfaces comienzan con una I mayúscula en su nombre. No me gusta esa convención, ya que nunca puedo estar seguro si alguien más falla.
  • java autoboxing puede morderte en el a **
  • el borrado de tipo Java realmente complica las cosas
atamanroman
fuente
2
Estás bromeando, ¿verdad? -1, sin embargo. No puedes hablar en serio.
3
al menos debe dejar en claro qué punto no le gusta, de lo contrario, debo suponer que solo está trolleando.
atamanroman
2
ahora no solo estás bromeando, sino que también eres ignorante: Linux ES importante en el área de backend, javadoc es mucho más limpio que estos estúpidos archivos de ayuda de ms que no funcionarán si los ves desde los recursos compartidos de la red. El castillo de arena casi no está documentado y es completamente inutilizable sin una interfaz gráfica de usuario adecuada. la mayoría de las personas estarán de acuerdo en que hay colecciones realmente agradables en el marco de Java y Joshua Bloch hicieron un buen trabajo allí. Y los libros "egghead" son solo libros que no entiendes. Eclipse es un IDE impresionante que VS no puede soportar sin complementos externos. Por cierto: me gusta C # y extraño linq en java. Sal de tu ms-office-world.
atamanroman
1
Sólo uno de estos elementos es un Gotcha
finnw
1
-1 de mí también, no sabes lo que es una buena idea (y, por lo tanto, no sabes mucho de nada relacionado con la programación). Editar: Pffft Java más maduro, Java ni siquiera tiene genéricos reales ..
6

El mayor obstáculo es asumir que el lenguaje y las bibliotecas de Java se comportan de la misma manera que las cosas de aspecto similar en C #. Haz los tutoriales, lee los javadocs, no asumas ...

Otra meta-trampa es asumir que el hecho de que puede hacer algo en Java con la misma facilidad / amabilidad que puede / podría hacer en C #. No es verdad. Java es un lenguaje mucho más antiguo, y se cometieron errores ...

¡Y la última meta-trampa es pensar que quejarse de cosas faltantes / diferentes en Java en SO te dará respuestas comprensivas / de apoyo universalmente!

Stephen C
fuente
3

Tenga cuidado con las diferencias en los modificadores de acceso predeterminados. También tenga en cuenta que todos los métodos no estáticos en Java son virtuales (a menos que los marque como finales).

Aunque está algo desactualizado, he encontrado que esta es una gran referencia.

Comparación de C # y Java, por Dare Obasanjo

usuario5631
fuente
3
Also note that all non-static methods in Java are virtual.Cómo me gustaría que C # fuera así también
Graphain
3
Me alegro de que no lo sea, ya que destruye la razón de la POO. Con cada método virtual por defecto, básicamente permite que se reemplace toda su clase, lo que generalmente no desea. Además, cambiar un método de no final a final puede romper el código derivado, mientras que la otra forma no.
Femaref
0

Creo que tu pregunta es subjetiva. Todo no se puede explicar aquí. Te sugiero que leas Java Puzzlers , By Joshua Bloch and Neal Gafter. Puede aprender más y estar a salvo de las trampas.


fuente
no todas las dificultades, pero las dificultades que el programador de C # puede hacer, en Java :)
Vimvq1987
1
@ Vimvq1987: no hay razón para suponer que no se encontrará con las trampas de "Java Puzzlers" después de cambiar a Java.
Stephen C
-1

En el lenguaje Java, los equivalentes objetivos de los tipos primitivos, como int, char, no son "tipos de valor" (por ejemplo, Integer es un tipo de referencia). En C #, el System.Int32 es una estructura.


fuente