www org mapwindows mapwindow espaƱol c# blackberry java-me migration

c# - org - mapwindows 5



La mejor manera de asimilar realmente Java-ME para un tipo C# (3)

Recientemente comencé a desarrollar aplicaciones para Blackberry. En consecuencia, tuve que saltar a Java-ME y aprender eso y sus herramientas asociadas. La sintaxis es fácil, pero sigo teniendo problemas con varios problemas y el medio ambiente.

Por ejemplo, algo que me sorprendió y desperdició mucho tiempo es la ausencia de propiedades reales en un objeto de clase (algo que supuse que tenían todos los lenguajes OOP). Hay muchas trampas He estado en varios lugares donde comparan la sintaxis de Java con C #, pero parece que no hay sitios que digan cosas que deben tenerse en cuenta al migrar a Java.

El medio ambiente es un problema completamente diferente, todos juntos. El Blackberry IDE es simplemente horrible. El aspecto me recuerda a Borland C ++ para Windows 3.1: está desactualizado. Algunos de los otros problemas incluyen irregularidades de inteligencia, depuración débil, etc. Blackberry tiene una versión beta del complemento Eclipse, pero sin soporte de depuración, es solo un editor con herramientas de refactorización sofisticadas.

Entonces, ¿algún consejo sobre cómo mezclarse con Java-ME?


La respuesta corta es: va a ser molesto, pero no difícil.

Java y C # tienen todos los mismos conceptos subyacentes, y muchas de las bibliotecas tienen un estilo muy similar, pero vas a seguir encontrando diferentes diferencias.

Si estás hablando de propiedades de clase, Java tiene esas. La sintaxis es

public class MyClass { public static int MY_CLASS_PROPERTY = 12; }

En serio, le sugiero que obtenga un IDE mejor. Cualquiera de Netbeans, Eclipse, IDEA, JBuider hará que su transición sea mucho más agradable.


Java no es significativamente diferente de C #. En un nivel puramente sintáctico, he aquí algunos consejos que pueden guiarlo durante el día:

  1. En Java tiene dos familias de excepciones: java.lang.Exception y todo lo que se deriva de ella, y RuntimeException . Esto es significativo porque en Java las excepciones están marcadas ; esto significa que para lanzar cualquier excepción que no sea de tiempo de ejecución también necesita agregar una anotación throws a su declaración de método. En consecuencia, cualquier método que use el suyo deberá detectar esa excepción o declarar que también arroja la misma excepción. Muchas de las excepciones que da por sentado, como NullPointerException o IllegalArgumentException , de hecho derivan de RuntimeException y, por lo tanto, no es necesario que las declare. Las excepciones controladas son un punto de controversia entre dos disciplinas, por lo que te recomiendo que las pruebes y veas si te ayudan o te molestan. A nivel personal, creo que las excepciones comprobadas mejoran significativamente el factoring y la robustez del código.

  2. Aunque Java ha admitido el autoboxing durante bastante tiempo, todavía existen bastantes diferencias entre las implementaciones C # y Java de las que debe tener conocimiento. Mientras que en C # puede usar intercambiablemente int como un tipo de valor y un tipo de referencia, en Java, literalmente, no son del mismo tipo: se obtiene el tipo de valor primitivo int y el tipo de referencia de biblioteca java.lang.Integer . Esto se manifiesta de dos formas comunes: no puede usar los tipos de valor como un parámetro de tipo genérico (por lo tanto, utilizará ArrayList<Integer> lugar de ArrayList<int> ) y los métodos de utilidad (como parse o toString ) son implementado estáticamente en el tipo de referencia (por lo que no es int a; a.toString(); sino más bien int a; Integer.toString( a ); ).

  3. Java tiene dos tipos distintos de clases anidadas, C # solo tiene una. En Java, una clase estática que no se declara con el modificador static se denomina clase interna y tiene acceso implícito a la instancia de la clase adjunta. Este es un punto importante porque, a diferencia de C #, Java no tiene ningún concepto de delegados, y las clases internas a menudo se utilizan para lograr el mismo resultado con relativamente poco dolor sintáctico.

  4. Los genéricos en Java se implementan de una manera radicalmente diferente que C #; cuando se desarrollaron genéricos para Java, se decidió que los cambios serán puramente sintácticos sin soporte de tiempo de ejecución, a fin de mantener la compatibilidad con versiones anteriores de máquinas virtuales antiguas. Sin soporte directo de genéricos en el tiempo de ejecución, Java implementa genéricos utilizando una técnica llamada borrado de tipos . Hay bastantes desventajas para escribir el borrado sobre la implementación C # de los genéricos, pero el punto más importante a tomar es que los tipos genéricos parametrizados en Java no tienen diferentes tipos de tiempo de ejecución . En otras palabras, después de la compilación, los tipos ArrayList<Integer> y ArrayList<String> son equivalentes . Si trabajas mucho con los genéricos, encontrarás estas diferencias mucho antes de lo que piensas.

Existen, en mi opinión, los tres aspectos más difíciles del lenguaje para que un desarrollador de C # compita. Aparte de eso, están las herramientas de desarrollo y la biblioteca de clases.

  1. En Java, existe una correlación directa entre el paquete (espacio de nombres), nombre de clase y nombre de archivo. Bajo un directorio raíz común, las clases com.example.SomeClass y org.apache.SomeOtherClass se encontrarán literalmente en com/example/SomeClass.class y org/apache/SomeOtherClass.class respectivamente. Tenga cuidado de tratar de definir múltiples clases en un solo archivo Java (es posible para clases privadas, pero no se recomienda), y apegarse a esta estructura de directorios hasta que se sienta más cómodo con el entorno de desarrollo.

  2. En Java tiene los conceptos de class-path y class-loader que no se asignan fácilmente a C # (hay equivalentes aproximados que no son de uso común para la mayoría de los desarrolladores de .NET). Classpath le dice a Java VM dónde se encuentran las bibliotecas y las clases (¡tanto las suyas como las bibliotecas compartidas del sistema!), Y puede pensar en los cargadores de clases como el contexto en el que viven sus tipos. Los cargadores de clases se usan para cargar tipos (archivos de clase) desde varias ubicaciones (disco local, Internet, archivos de recursos, etc.) pero también restringen el acceso a esos archivos. Por ejemplo, un servidor de aplicaciones como Tomcat tendrá un cargador de clases para cada aplicación registrada, o contexto; esto significa que una clase estática en la aplicación A no será la misma que una clase estática en la aplicación B, incluso si tienen el mismo nombre e incluso si comparten la misma base de código. AppDomains proporciona una funcionalidad algo similar en .NET.

  3. La biblioteca de clases Java es similar al BCL; muchas de las diferencias son cosméticas, pero son suficientes para hacer que se postule para la documentación (y / o Google) una y otra vez. Lamentablemente, no creo que haya nada que hacer aquí, sino que se familiarizará con las bibliotecas sobre la marcha.

En pocas palabras: la única forma de asimilar Java es usarlo. La curva de aprendizaje no es empinada, pero prepárese para sorprenderse y frustrarse a menudo durante los primeros dos o tres meses de uso.


Este tipo aquí tuvo que hacer la transición inversa. Entonces, enumeró las 10 principales diferencias de Java y C #. Tomaré sus temas y mostraré cómo está hecho en Java:

Gotcha # 10 - ¡Dame mi salida estándar!

Para imprimir a la salida estándar en Java:

System.out.println("Hello");

Gotcha # 9 - Namespaces == Freedom

En Java, no tienes la libertad de espacios de nombres. La estructura de carpetas de su clase debe coincidir con el nombre del paquete. Por ejemplo, una clase en el paquete org.test debe estar en la carpeta org / test

Gotcha # 8 - ¿Qué pasó con Super?

En Java para referirse a la superclase, utiliza la palabra reservada super lugar de base

Gotcha # 7 - Encadenando constructores a un constructor base

No tienes esto en Java. Tienes que llamar al constructor por ti mismo

Gotcha # 6 - Dagnabit, ¿cómo puedo subclasificar una clase existente?

Para subclase de una clase en Java, haga esto:

public class A extends B { }

Eso significa que la clase A es una subclase de la clase B En C # sería la class A : B

Gotcha # 5 - ¿Por qué las constantes no se mantienen constantes?

Para definir una constante en Java usa la palabra clave final lugar de const

Gotcha # 4 - ¿Dónde está ArrayList , Vector o Hashtable ?

Las estructuras de datos más utilizadas en Java son HashSet , ArrayList y HashMap . Implementan Set , List y Map . Por supuesto, hay un montón más. Lea más sobre colecciones aquí

Gotcha # 3 - De usuarios y mutadores (Getters y Setters)

No tiene la función de propiedades en Java. Tienes que declarar los métodos get y sets para ti. Por supuesto, la mayoría de los IDE pueden hacer eso automáticamente.

Gotcha # 2 - ¿No puedo anular?

No tiene que declarar un método virtual en Java. Todos los métodos, excepto los declarados final , pueden anularse en Java.

Y el # 1 se puso ...

En Java, los tipos primitivos int , float , double , char y long no son Object like en C #. Todos ellos tienen una representación de objeto respectiva, como Integer , Float , Double , etc.

Eso es. No olvides ver el enlace original , hay una discusión más detallada.