CodeGym /Blog Java /Random-ES /¿Quedó atascado? Las partes más difíciles de aprender Jav...
John Squirrels
Nivel 41
San Francisco

¿Quedó atascado? Las partes más difíciles de aprender Java y cómo superarlas

Publicado en el grupo Random-ES
Como sabes, recomendamos a los principiantes en codificación que comiencen a aprender lenguajes de programación con Java, y CodeGym tiene todo para hacer que el proceso de aprendizaje de Java sea digerible incluso para los estudiantes menos preparados. Pero tanto como los elementos de gamificación, la historia sencilla y los personajes divertidos ayudan a facilitar este proceso, aprender los fundamentos de Java en su totalidad rara vez se presenta sin desafíos para la mayoría de los nuevos estudiantes. ¿Quedó atascado?  Las partes más difíciles de aprender Java y cómo superarlas - 1Hoy vamos a echar un vistazo a algunas de las áreas más difíciles de los fundamentos de la programación Java, tratando de entender por qué muchas personas las encuentran difíciles y si hay algo que usted pueda hacer al respecto.

1. Genéricos

Los genéricos en Java son tipos que tienen un parámetro. Al crear un tipo genérico, especifica no solo un tipo, sino también el tipo de datos con el que funcionará. Los estudiantes de Java suelen mencionar los genéricos como una de las partes de Java más difíciles de entender. “Mi principal problema sigue siendo tratar con los genéricos. Es mucho más fácil cuando tienes métodos con parámetros a seguir, pero se vuelve confuso cuando tienes que escribir los tuyos”, dijo un estudiante anónimo de Java.

Consejos y recomendaciones

Esta es una opinión sobre los genéricos en Java de Ravi Reddy, un programador experimentado y profesor universitario: “Los genéricos de Java hacen una cosa que las plantillas de C++ no hacen: implementar la seguridad de tipos. La implementación de plantillas de C++ es un simple truco de preprocesador y no garantiza la seguridad de tipos. Los genéricos en Java son como plantillas de C++ pero con seguridad de tipo adicional. Y en mi humilde opinión, la seguridad tipográfica es una característica esencial de cualquier buen entorno de desarrollo. ¡Y si! Pueden resultar confusos debido a nuestros cambios mentales entre los parámetros y los tipos. Pero creo que vale la pena dedicar tiempo a dominarlos. Porque me encontré "pensando" mucho mejor en Java una vez que entendí las interfaces y los genéricos".

2. Multihilo

El subprocesamiento múltiple en Java es un proceso de ejecución de dos o más subprocesos al mismo tiempo para lograr la máxima utilización de la CPU por parte de la aplicación. Multithreading resuelve tareas muy importantes y puede hacer que nuestros programas sean más rápidos. A menudo, muchas veces más rápido. Pero se considera que es uno de los temas en los que muchos principiantes de Java tienden a atascarse. Todo porque los subprocesos múltiples también pueden crear problemas en lugar de resolverlos. Hay dos problemas específicos que pueden crear los subprocesos múltiples: interbloqueo y condiciones de carrera. Interbloqueo es una situación en la que varios subprocesos están esperando los recursos que tienen entre sí, y ninguno de ellos puede continuar ejecutándose. Una condición de carrera es un error de diseño en un sistema o aplicación de subprocesos múltiples, donde la operación del sistema o aplicación depende del orden en que se ejecutan las partes del código.

Consejos y recomendaciones

Aquí hay una buena recomendación.sobre cómo lidiar con los subprocesos múltiples de S.Lott, un arquitecto de software y usuario activo de StackExchange, un popular sitio web de preguntas y respuestas: “Los subprocesos múltiples son simples. Codificar una aplicación para subprocesos múltiples es muy, muy fácil. Hay un truco simple, y consiste en usar una cola de mensajes bien diseñada (no arroje la suya propia) para pasar datos entre subprocesos. La parte difícil es intentar que varios subprocesos actualicen mágicamente un objeto compartido de alguna manera. Ahí es cuando se vuelve propenso a errores porque la gente no presta atención a las condiciones de carrera que están presentes. Muchas personas no usan colas de mensajes e intentan actualizar objetos compartidos y crear problemas para ellos mismos. Lo que se vuelve difícil es diseñar un algoritmo que funcione bien al pasar datos entre varias colas. Eso es difícil.

3. Problemas de classpath

Los errores de classpath también se consideran uno de los problemas más denunciados a los que se enfrentan los desarrolladores de Java en su trabajo diario. “Los problemas de Classpath pueden llevar mucho tiempo para depurar y tienden a ocurrir en los peores momentos y lugares posibles: antes de los lanzamientos y, a menudo, en entornos donde el equipo de desarrollo tiene poco o ningún acceso. También pueden ocurrir a nivel de IDE y convertirse en una fuente de reducción de la productividad”, dice Vasco Ferreira, un desarrollador experimentado de Java/Javascript y autor de tutoriales relacionados con la programación.

Consejos y recomendaciones

“Los problemas de Classpath no son de tan bajo nivel o inaccesibles como podrían parecer al principio. Se trata de que los archivos zip (jars) estén presentes/no estén presentes en ciertos directorios, cómo encontrar esos directorios y cómo depurar el classpath en entornos con acceso limitado. Al conocer un conjunto limitado de conceptos como Class Loaders, Class Loader Chain y los modos Parent First / Parent Last, estos problemas se pueden abordar de manera efectiva”, explica el experto.

4. Polimorfismo y usarlo correctamente

Cuando se trata de los principios de la programación orientada a objetos, muchas personas dicen que tuvieron dificultades para comprender el polimorfismo. El polimorfismo es la capacidad de un programa para tratar objetos con la misma interfaz de la misma manera, sin información sobre el tipo específico del objeto. A pesar de que el polimorfismo es un tema bastante básico, es bastante extenso y forma una buena parte de la base de Java. Para muchos estudiantes, el polimorfismo es una primera dificultad para aprender Java. Todo porque hay diferentes formas de polimorfismo que se usan en diferentes contextos, lo que puede resultar confuso.

Consejos y recomendaciones

No hay otra forma de lidiar con el polimorfismo que no sea aprenderlo. Así es como Torben Mogensen, profesor de programación en la Universidad de Copenhague, explicaeste concepto: “Sobrecarga simple: + puede significar suma de enteros, suma de punto flotante y (en algunos idiomas) concatenación de cadenas. Polimorfismo de subtipo: si B es un subtipo de (se hereda de) A, cualquier valor de tipo B se puede usar en un contexto que espera un valor de tipo A. Polimorfismo paramétrico: un tipo se puede parametrizar con parámetros de tipo, de modo que usted en diferentes contextos pueden proporcionar diferentes argumentos de tipo, por lo que crea una instancia del tipo parametrizado en diferentes tipos concretos. Esto también se denomina "plantillas" o "genéricos" y en los lenguajes orientados a objetos generalmente se especifica mediante corchetes angulares (como T<A>). Polimorfismo de interfaz. Este es básicamente un mecanismo en el que restringe el polimorfismo de subtipos a subtipos que implementan una determinada interfaz o polimorfismo paramétrico para escribir parámetros que implementan una determinada interfaz ".

5. Reflexión

La reflexión es un mecanismo para explorar datos sobre un programa mientras se está ejecutando. Reflection le permite explorar información sobre campos, métodos y constructores de clases. También le permite trabajar con tipos que no estaban presentes en el momento de la compilación, pero que estuvieron disponibles durante el tiempo de ejecución. La reflexión y un modelo lógicamente consistente para emitir información de error hacen posible crear un código dinámico correcto. Pero para muchas personas, no es tan fácil averiguar cómo usar Reflection.

Consejos y recomendaciones

“En el caso de la reflexión y Java, la reflexión permite que Java, que está diseñado para escribirse estáticamente, se escriba dinámicamente. La escritura dinámica no es inherentemente mala. Sí, le permite al programador romper ciertos principios de programación orientada a objetos, pero al mismo tiempo permite muchas características poderosas como el proxy en tiempo de ejecución y la inyección de dependencia. Sí, Java te permite pegarte un tiro en el pie usando la reflexión. Sin embargo, debe apuntar muy explícitamente con el arma a su pie, quitar el seguro y apretar el gatillo”, explica Jayesh Lalwani, un programador Java experimentado y arquitecto de aplicaciones.

6. Flujos de entrada/salida

Los flujos le permiten trabajar con cualquier fuente de datos: Internet, el sistema de archivos de su computadora u otra cosa. Los streams son una herramienta universal. Permiten que un programa reciba datos desde cualquier lugar (flujos de entrada) y los envíe a cualquier lugar (flujos de salida). Su tarea es la misma: tomar datos de un lugar y enviarlos a otro. Hay dos tipos de flujos: flujos de entrada (utilizados para recibir datos) y flujos de salida (para enviar datos). Lo que dificulta que muchas personas entiendan el uso de flujos es el hecho de que Java tiene múltiples clases de flujo de E/S.

Consejos y recomendaciones

“Java tiene tantas clases de flujo de E/S principalmente debido a dos factores contribuyentes. Primero es el legado. Algunas clases todavía están allí por razones históricas y no están obsoletas ya que no se consideran dañinas. Segundo, flexibilidad. Las diferentes aplicaciones tienen diferentes requisitos y, por lo tanto, tiene múltiples opciones según sus requisitos. Las abstracciones útiles brindan claridad cuando lo lees y con pocas líneas de código puedes hacer mucho”, dice Jonas Mellin, un experto en Java de Suecia. ¿Qué aspectos de Java le resultaron más difíciles de entender o se quedó atascado durante algún tiempo? Comparte tus experiencias en los comentarios.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION