Conceptos Java
Conceptos Java
Abstracción
Se trata de la capacidad de centrarse en un nivel superior de un problema, ignorando los detalles de las
partes. En la POO, la abstracción se basa en obtener la información esencial de los objetos y cosas simples
para representar la complejidad.
Encapsulamiento
Se refiere a envolver algo en una capa protectora. En Java, la encapsulación permite definir niveles de
visibilidad para los elementos de la clase.
Herencia
Permite construir nuevas clases basadas en clases existentes, lo que facilita la reutilización y extensión del
código.
Polimorfismo
Permite que los objetos se comporten de distintas maneras según el contexto. En la POO, el polimorfismo
es la capacidad de algunos lenguajes para hacer que cada objeto responda de forma distinta a un mismo
mensaje.
ANOTACIONES EN JAVA
La anotación @Override en Java se utiliza para indicar que un método en una subclase está
sobrescribiendo un método en su superclase o en una interfaz que está implementando. Esto sirve como
una verificación en tiempo de compilación para garantizar que la firma del método coincida con la de la
superclase o interfaz.
@SessionScoped es una anotación en Java EE o Jakarta EE que se utiliza para definir el alcance de una
clase administrada por el contenedor en un entorno web. Específicamente, la anotación indica que el ciclo
de vida de un bean estará vinculado a la sesión HTTP del usuario.
La anotación @Named en Java EE o Jakarta EE se utiliza para que un bean administrado por el contenedor
pueda ser accedido desde tecnologías de presentación como JSF (JavaServer Faces) o CDI (Context and
Dependency Injection) mediante su nombre lógico.
SERIALIZACIÓN:
En Java, la palabra "serialización" se refiere al proceso de convertir un objeto en una secuencia de bytes
que puede ser almacenada en un archivo o transmitida a través de una red. Un objeto que se puede
serializar se dice que es "serializable".
Estructuras en java:
If y else : si se cumple la condición especificada, haz lo siguiente. En el resto de casos, haz esto otro.
SWITCH CASE:
En Java, la instrucción switch se utiliza para ejecutar un bloque de código entre varias opciones en función
del valor de una expresión. A menudo se utiliza como alternativa a varias if-else instrucciones. A
continuación, se muestra la sintaxis y un ejemplo:
BUCLES (while):
acumulador: Un acumulador suma valores a medida que se ejecuta un proceso, como sumar números en
un bucle.
contador: Un contador incrementa su valor cada vez que ocurre un evento. Esto es útil para contar
elementos, iteraciones o condiciones.
FOR:
Es una estructura de control que se usa para iterar sobre una secuencia de elementos, realizar un número
específico de repeticiones o recorrer una colección.
for clasico:
for each:
Ideal para recorrer elementos en una colección o array sin necesidad de un índice.
Un arreglo:
Es una colección de elementos del mismo tipo, almacenados en ubicaciones de memoria contiguas. Cada
elemento se accede mediante un índice, que suele comenzar en cero. Son útiles para almacenar listas de
valores conocidos y de tamaño fijo.
Vectores:
En programación, un vector es similar a un arreglo pero de tamaño dinámico. En Java, el Vector de la
biblioteca estándar permite que crezca o se reduzca según se añadan o eliminen elementos.
Diferencias clave
Arreglos: Fijos y de una sola dimensión en la mayoría de los casos.
Vectores: Dinámicos y de una dimensión (en Java pueden redimensionarse).
Matrices: Extensión de arreglos a múltiples dimensiones, útiles para representar tablas o cuadrículas.
TRY CATCH
El try-catch en Java es una estructura de control utilizada para manejar excepciones, que son eventos
inesperados o errores que ocurren durante la ejecución del programa y pueden causar que este se
interrumpa. Al utilizar un bloque try-catch, podemos anticipar y controlar estos errores para que el
programa siga funcionando de manera estable.
try {
// Código que podría lanzar una excepción
} catch (TipoDeExcepcion e) {
// Código para manejar la excepción
}
En Java, la palabra clave throw se utiliza para lanzar una excepción de manera explícita durante la
ejecución de un programa. Permite al programador interrumpir el flujo normal del programa cuando se
detecta una condición de error o una situación excepcional.
Los errores representan condiciones críticas de las que una aplicación normalmente no se puede
recuperar. Se recomienda no capturarlos porque indican problemas graves, como fallos de memoria
(OutOfMemoryError) o errores de sistema.
OutOfMemoryError: La JVM se queda sin memoria para ejecutar el programa.
StackOverflowError: Ocurre generalmente por recursión infinita.
VirtualMachineError: Indica problemas en la máquina virtual de Java.
PRINCIPIOS SOLID:
Son un conjunto de principios diseñados para desarrollar código escalable, mantenible y flexible.
Ayudan a mejorar la comprensión del código, facilitan la incorporación de nuevas características y
minimizan los errores durante el desarrollo y mantenimiento.
RESPONSABILIDAD UNICA:
La S del acrónimo del que hablamos hoy se refiere a Single Responsibility Principle (SRP). Según este
principio “una clase debería tener una, y solo una, razón para cambiar”. Es esto, precisamente, “razón para
cambiar”, lo que Robert C. Martin identifica como “responsabilidad”.
ABIERTO - CERRADO:
El segundo principio de SOLID lo formuló Bertrand Meyer en 1988 en su libro “Object Oriented Software
Construction” y dice: “Deberías ser capaz de extender el comportamiento de una clase, sin modificarla”. En
otras palabras: las clases que usas deberían estar abiertas para poder extenderse y cerradas para
modificarse.
SUSTITUCIÓN DE LISKOV
La L de SOLID alude al apellido de quien lo creó, Barbara Liskov, y dice que “las clases derivadas deben
poder sustituirse por sus clases base”.
SEGREGACIÓN DE INTERFACES:
En el cuarto principio de SOLID, el tío Bob sugiere: “Haz interfaces que sean específicas para un tipo de
cliente”, es decir, para una finalidad concreta.
INVERSIÓN DE DEPENDENCIAS:
Llegamos al último principio: “Depende de abstracciones, no de clases concretas”. Los módulos de alto
nivel no deberían depender de módulos de bajo nivel. Ambos deberían depender de abstracciones. Las
abstracciones no deberían depender de los detalles. Los detalles deberían depender de las abstracciones.
GIT:
Git es un sistema de control de versiones distribuido que permite a los desarrolladores rastrear y
administrar los cambios en el código fuente de sus proyectos.
Control de versiones: Permite crear diferentes versiones del proyecto, facilitando la revisión de cambios
pasados y la recuperación de versiones anteriores si es necesario.
Ramas (branches): Con Git, puedes crear ramas para trabajar en diferentes funcionalidades o correcciones
sin afectar el código principal (generalmente en la rama main o master). Luego, puedes combinar (merge)
estas ramas.
Distribución: Git es distribuido, lo que significa que cada desarrollador tiene una copia completa del
historial del proyecto. Esto facilita el trabajo offline y la colaboración descentralizada.
Comandos básicos de Git:
GitHub:
GitHub es una plataforma en línea que utiliza Git para facilitar la colaboración y el alojamiento de
repositorios. Aunque Git se usa localmente en el sistema de archivos de un desarrollador, GitHub permite
almacenar estos repositorios de manera remota y compartirlos con otros. Algunas de las funciones más
útiles de GitHub incluyen:
Repositorios remotos: GitHub permite a los desarrolladores subir su código a un repositorio remoto,
facilitando el acceso y la colaboración.
Colaboración: GitHub es ideal para proyectos colaborativos. Los desarrolladores pueden crear "pull
requests" para proponer cambios, y otros pueden revisarlos antes de fusionarlos al código principal.
Integración con CI/CD: GitHub se integra con herramientas de integración y despliegue continuo para
automatizar las pruebas y el despliegue del código.
Issues y proyectos: GitHub ofrece herramientas de gestión de tareas y seguimiento de errores (issues) para
mejorar la organización del proyecto.
Documentación: Puedes agregar documentación a los repositorios usando README.md y crear wikis.
1. git init
2. git add .
3. git commit -m "first commit"
4. git remote add origin
https://github.com/NOMBRE_USUARIO/NOMBRE_PROYECTO.git
8. git push -u origin (nombre) // es para subir al repositorio, colocar el nombre de la rama en donde deseo
subirlo.
cambiar de rama:
sirve para ver la rama
5. git branch // es para ver la rama en la que estoy trabajando
6. git branch (_nombre___) // es para crear una nueva rama
7. git checkout (-rama-) //es para cambiar de rama, se coloca el nombre de la rama.
Monolito
Un sistema monolítico es una aplicación única y cohesiva en la que todos los módulos y componentes
están integrados en un solo proyecto. Todo el código (por ejemplo, frontend, backend, lógica de negocio,
acceso a datos) se agrupa en una única unidad que se despliega como un bloque completo.
● Simplicidad: Al estar todo en un solo proyecto, es más fácil de desarrollar y desplegar para equipos
pequeños.
● Performance: La comunicación entre los componentes es directa, ya que todos están en el mismo
proceso, lo que reduce la latencia.
● Menor complejidad inicial: Especialmente útil para proyectos pequeños o que no requieren
escalabilidad extrema.
● Facilidad en el manejo de transacciones: Es más sencillo mantener la consistencia y controlar las
transacciones.
Ejemplo:
JavaServer Faces (JSF) es un framework para construir interfaces de usuario en aplicaciones web Java.
Forma parte de la especificación de Java EE (actualmente Jakarta EE) y facilita el desarrollo de aplicaciones
web mediante el uso de componentes reutilizables y un modelo de eventos basado en Java. Aquí algunos
aspectos clave de JSF:
Microservicios
La arquitectura de microservicios consiste en dividir la aplicación en múltiples servicios independientes,
cada uno con una función específica. Estos servicios pueden comunicarse entre sí, generalmente mediante
APIs o mensajes, y cada uno se despliega y escala de forma independiente.
● Escalabilidad: Los servicios se pueden escalar individualmente, lo que permite asignar recursos solo
a los servicios que lo necesitan.
● Flexibilidad en tecnología: Cada microservicio puede desarrollarse usando diferentes tecnologías,
lo que permite elegir la herramienta más adecuada para cada caso.
● Despliegue independiente: Cada servicio puede actualizarse y desplegarse sin afectar al resto de la
aplicación.
● Facilidad en el desarrollo ágil: Los equipos pueden trabajar en diferentes servicios de forma
independiente, promoviendo un desarrollo ágil y paralelo.
Ejemplos:
Spring es un framework completo para construir aplicaciones Java de todo tipo, especialmente
aplicaciones empresariales. Su núcleo se basa en la Inversión de Control (IoC) y Inyección de Dependencias
(DI), que permite gestionar y configurar los objetos de la aplicación de manera modular y flexible.
Spring Boot es una extensión de Spring que simplifica la configuración y el despliegue de aplicaciones. Fue
creado para reducir la complejidad de configuración en proyectos Spring, proporcionando una
configuración predeterminada para construir aplicaciones rápidamente. Con Spring Boot, se puede lanzar
una aplicación con solo unas pocas líneas de configuración.
PATRÓN DE DISEÑO:
Un patrón de diseño es una solución reutilizable y probada para problemas comunes en el diseño de
software. Estos patrones no son soluciones específicas, sino guías o plantillas que se pueden aplicar en
diversas situaciones de programación para mejorar la estructura y mantenibilidad del código.
Patrón dao:
El Patrón DAO (Data Access Object) es un patrón de diseño estructural que se utiliza para abstraer y
encapsular el acceso a datos. Este patrón separa la lógica de persistencia (acceso a bases de datos) de la
lógica de negocio, promoviendo la independencia entre la aplicación y los detalles del almacenamiento de
datos.
paquete:
● model
● controller
● dao
● service
● vista
Patrón MVC:
El patrón MVC (Model-View-Controller) es un patrón de diseño arquitectónico que separa una aplicación
en tres componentes principales: Modelo, Vista y Controlador. Este patrón es muy utilizado en el
desarrollo de aplicaciones para mantener la lógica de negocio, la interfaz de usuario y el control del flujo de
datos bien organizados y desacoplados.
paquete:
● modelo
● controller
● vista
BASE DE DATOS:(relacionales)(SQLserver, mySQL, posgreSQL, sqlLite,Oracle,etc)
Tablas Maestras
Las tablas maestras almacenan datos fijos o de referencia que no cambian frecuentemente. Estos datos
son consultados por otras tablas, por lo que se estructuran para que su información sea clara, uniforme y
consistente.
Tablas Transaccionales
Las tablas transaccionales almacenan datos que se actualizan o agregan continuamente, registrando
transacciones o eventos específicos.
Left outer Join. Cuándo quieres todas las filas para las que haya match pero también aquellas de la Tabla
A que no hagan match. Siguiendo el ejemplo anterior, si quieres listar todos los productos con datos de sus
pedidos pero mostrando también aquellos productos para los que no tengas todavía un pedido, la solución
sería hacer una Left Outer join entre Producto y Pedido.
Right outer Join. Exactamente lo mismo pero a la inversa, cuando quieres listar las filas de la tabla B
aunque no estén relacionadas con ninguna fila de la tabla A. Es un operador un poco redundante ya que se
podría cambiar simplemente el orden de las tablas en el Join y utilizar un left outer para conseguir el
mismo efecto. No obstante, y como parte de Joins múltiples, es útil tener los dos para una mejor
comprensión de la consulta.
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
FULL OUTER JOIN. Es como la suma de las dos anteriores. Queremos tanto las filas de la A como las de
B, tanto si hay match como si no (evidentemente cuando haya match la consulta devolverá todos los
campos de A y B que hayamos indicado, cuando no, la consulta devolverá sólo los campos de A o B).
PRIMEFACES SHOWCASE
https://primefaces.github.io/primefaces/12_0_0/#/core/ajaxRendering
https://www.primefaces.org/showcase/index.xhtml?jfwid=d0ec4
programación funcional
programación reactiva