¿Cuáles son algunos de los comunes de Java trampas/trampas para el programador de C++?

StackOverflow https://stackoverflow.com/questions/433853

  •  10-07-2019
  •  | 
  •  

Pregunta

Como la pregunta dice, lo que son algunos de los/las principales cuestiones que los programadores de C++ cara cuando el cambio a Java?Estoy buscando algunos amplio tema de los nombres o de los ejemplos y el día a día de los ajustes que los ingenieros tuvieron que hacer.A continuación, puedo ir y hacer una lectura de la profundidad de esta.

Estoy especialmente interesado en las opiniones de los ingenieros que han trabajado en C++ para años y tuvo que trabajar con Java, pero los punteros de los demás o incluso recomendaciones de libros son más que bienvenidos.

¿Fue útil?

Solución

  • En C ++ usaría destructores para limpiar los descriptores de archivo, las conexiones de la base de datos y similares. El ingenuo equivalente es usar finalizadores. No lo hagas Nunca.

En su lugar, use este patrón:

OutputStream os;
try {
  os = ... 
  // do stuff
} finally {
  try { os.close(); } catch (Exception e) { }
}

Terminarás haciendo muchas cosas así.

  • Si no especifica ningún modificador de acceso, en Java los miembros son privados de paquete por defecto , a diferencia de C ++ en el que son privados. Package-private es un nivel de acceso molesto, lo que significa que es privado, pero cualquier cosa en el mismo paquete también puede acceder a él (que es un nivel de acceso predeterminado idiota en mi humilde opinión);
  • No hay separación de pila / montón. Todo se crea en el montón (bueno, eso no es estrictamente cierto, pero vamos a pretender que lo es);
  • No hay referencia de paso;
  • El equivalente a los punteros de función son las interfaces anónimas.

Otros consejos

Mi mayor obstáculo para cruzar de C ++ a Java fue deshacerse del código de procedimiento. Estaba muy acostumbrado a unir todos mis objetos dentro de los procedimientos. Sin código de procedimiento en Java, hice referencias circulares en todas partes. Tuve que aprender a llamar objetos desde objetos sin que sean dependientes entre sí. Fue el obstáculo más grande pero el más fácil de superar.

El problema personal número 2 es la documentación. JavaDoc es útil, pero para muchos proyectos de Java se tiene la idea errónea de que todo lo que se necesita es JavaDoc. Vi mucha mejor documentación en proyectos de C ++. Esto puede ser solo una preferencia personal para la documentación fuera del código.

Número 3. De hecho, hay punteros en java, solo que no hay aritmética de punteros . En java se llaman referencias . No piense que puede ignorar hacia dónde apuntan las cosas, volverá con un gran bocado.

  • == y .equals no son iguales.

  • == mirará el puntero (referencia) mientras que .equals mirará el valor al que apunta la referencia.

Genéricos (en lugar de plantillas), específicamente la forma en que se implementaron usando tipo de borrado .

Dado que menciona las recomendaciones de libros, definitivamente lea Java efectivo, 2ª ed. & # 8212; aborda la mayoría de las trampas que he visto en las respuestas.

Crear una referencia por accidente cuando uno estaba pensando en un constructor de copias:

myClass me = new myClass();
myClass somebodyElse = me; /* A reference, not a value copied into an independent instance! */
somebodyElse.setPhoneNumber(5551234);
/* Hey... how come my phone doesn't work anymore?!?!?  */
  • Sin herencia múltiple, y cada clase deriva implícitamente de java.lang.Object (que tiene varios métodos importantes que definitivamente debes conocer y comprender)
  • Puede tener una especie de herencia múltiple implementando interfaces
  • Sin sobrecarga del operador, excepto '+' (para cadenas), y definitivamente ninguna que pueda hacer usted mismo
  • No hay tipos numéricos sin signo, excepto char, que realmente no debería usarse como tipo numérico. Si tiene que lidiar con tipos no firmados, debe realizar muchos cambios y enmascaramientos.
  • Las cadenas no tienen terminación nula, sino que se basan en matrices de caracteres y, como tales, son inmutables. Como consecuencia de esto, construir una cadena larga agregando con + = en un bucle es O (n ^ 2), así que no lo hagas; use un StringBuilder en su lugar.

Acostumbrarse a tener un recolector de basura. No poder confiar en un destructor para limpiar recursos que el GC no maneja.

Todo se pasa por valor, porque se pasan referencias en lugar de objetos.

Sin constructor de copia, a menos que necesite clonar. Sin operador de asignación.

Todos los métodos son virtuales de forma predeterminada, que es lo contrario de C ++.

Soporte de lenguaje explícito para interfaces: clases virtuales puras en C ++.

Son todas las pequeñas diferencias de sintaxis que me han afectado. Falta de destructores.

Por otro lado, ser capaz de escribir un main para cada clase (inmensamente útil o prueba) es realmente agradable; después de que te acostumbras, la estructura y los trucos disponibles con los archivos jar son realmente agradables; el hecho de que la semántica esté completamente definida (por ejemplo, int es igual en todas partes) es realmente agradable.

Mi peor problema fue tener en cuenta la propiedad de la memoria en todo momento. En C ++, es algo que hay que hacer, y crea algunos patrones en la mente del desarrollador que son difíciles de superar. En Java, puedo olvidarlo (en un grado muy alto, de todos modos), y esto permite algunos algoritmos y enfoques que serían extremadamente incómodos en C ++.

No hay objetos en Java, solo hay referencias a objetos. Por ejemplo:

MyClass myClass;   // no object is created unlike C++.

Pero:

MyClass myClass = new MyClass();   // Now it is a valid java object reference.

El mejor libro de Java " gotchas " que he leído es Java Puzzlers: trampas, trampas y casos de esquina . no está dirigido específicamente a los desarrolladores de C ++, pero está lleno de ejemplos de cosas que debe tener en cuenta.

Especificar un parámetro de método como final no significa lo que al principio cree que significa

private void doSomething(final MyObject myObj){
   ...
   myObj.setSomething("this will change the obj in the calling method too");
   ...
}

debido a que Java es pasar por valor, está haciendo lo que está pidiendo, pero no es obvio de inmediato, a menos que comprenda cómo Java pasa el valor de la referencia en lugar del objeto.

Otro notable es la palabra clave final y const.Java define la const como una palabra clave reservada pero no especifica mucho de su uso.También

object1=object2

no copia los objetos cambia la referencia

Todos los métodos son virtuales.

Los tipos parametrizados (genéricos) en realidad no crean código específico de parámetro de código (es decir, List<String> usa el mismo código de bytes que List<Object>; el compilador es lo único que se queja si intenta poner un Integer en el primero).

Varargs es fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top