JavaRush /Blog Java /Random-ES /Pausa para el café #134. Qué evitar al escribir código Ja...

Pausa para el café #134. Qué evitar al escribir código Java. Cómo se utilizan final, finalmente y finalizar en Java

Publicado en el grupo Random-ES

Qué evitar al escribir código Java

Fuente: Medio Le informamos sobre un artículo que enumera errores comunes que cometen los desarrolladores al escribir código Java. Pausa para el café #134.  Qué evitar al escribir código Java.  Cómo se usan final, finalmente y finalizar en Java - 1

Usando valores de enumeración

Que esto se considerara un error me tomó por sorpresa ya que usaba Enum.values ​​​​regularmente . El problema aquí es que se supone que Enum.values() es una lista inmutable según la especificación. Para hacer esto, debe devolver una nueva instancia de la matriz con los valores de enumeración cada vez que se llama.
public enum Fruits {
    APPLE, PEAR, ORANGE, BANANA;

    public static void main(String[] args) {
        System.out.println(Fruits.values());
        System.out.println(Fruits.values());
    }
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
Aquí hay dos objetos separados en la memoria, por lo que puede que no parezca gran cosa. Pero si usa Fruit.values() al procesar una solicitud y tiene una carga alta, esto puede provocar problemas de memoria. Puede solucionar este problema fácilmente introduciendo una variable final estática privada VALUES para el almacenamiento en caché.

Pasar parámetros opcionales como parámetro de método

Considere el siguiente código:
LocalDateTime getCurrentTime(Optional<ZoneId> zoneId) {
    return zoneId.stream()
        .map(LocalDateTime::now)
        .findFirst()
        .orElse(LocalDateTime.now(ZoneId.systemDefault()));
}
Pasamos el parámetro opcional ZoneId y, en función de su presencia, decidimos si dar la hora en la zona horaria del sistema o utilizar la zona especificada. Sin embargo, esta no es la forma correcta de trabajar con Opcional. Deberíamos evitar usarlos como parámetro y en su lugar usar la sobrecarga de métodos.
LocalDateTime getCurrentTime(ZoneId zoneId) {
  return LocalDateTime.now(zoneId);
}

LocalDateTime getCurrentTime() {
  return getCurrentTime(ZoneId.systemDefault());
}
El código que ve arriba es mucho más fácil de leer y depurar.

Usando StringBuilder

Las cadenas en Java son inmutables. Esto significa que una vez creados ya no son editables. La JVM mantiene un grupo de cadenas y, antes de crear uno nuevo, llama al método String.intern() , que devuelve una instancia del grupo de cadenas correspondiente al valor, si existe. Digamos que queremos crear una cadena larga concatenando elementos en ella.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
Recientemente nos dijeron que era una muy mala idea porque las versiones anteriores de Java hacían lo siguiente:
  • en la línea 1, la cadena "inicio" se inserta en el grupo de cadenas y apunta a longString
  • la línea 2 agrega la cadena "startmiddle" al grupo y apunta a ella con longString
  • en la línea 3 tenemos “startmiddlemiddle”
  • en la línea 4 - "startmiddlemiddlemiddle"
  • y finalmente en la línea 5 agregamos "startmiddlemiddlemiddleend" al grupo y le apuntamos con longString
Todas estas filas permanecen en el grupo y nunca se utilizan, lo que provoca que se desperdicie una gran cantidad de RAM. Para evitar esto podemos usar StringBuilder.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
StringBuilder crea solo una cadena cuando se llama al método toString , eliminando así todas las cadenas intermedias que se agregaron inicialmente al grupo. Sin embargo, después de Java 5, el compilador hace esto automáticamente , por lo que es mejor usar la concatenación de cadenas usando "+".

Usar envoltorios primitivos cuando no son necesarios

Considere los siguientes dos fragmentos:
int sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Integer sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
El primer ejemplo se ejecuta seis veces más rápido que el segundo en mi computadora. La única diferencia es que utilizamos una clase contenedora Integer. La forma en que funciona Integer es que en la línea 3, el tiempo de ejecución debe convertir la variable de suma en un entero primitivo (unboxing automático) y, una vez realizada la suma, el resultado se empaqueta en una nueva clase Integer. (embalaje automático). Esto significa que estamos creando 1 millón de clases enteras y realizando dos millones de operaciones de empaquetado, lo que explica la dramática desaceleración. Las clases contenedoras solo deben usarse cuando es necesario almacenarlas en colecciones. Sin embargo, las versiones futuras de Java admitirán colecciones de tipos primitivos, lo que hará que los contenedores queden obsoletos.

Cómo se utilizan final, finalmente y finalizar en Java

Fuente: Newsshare En este artículo aprenderá dónde, cuándo y por qué se usa la palabra clave Finalize, y si vale la pena usarla en Java. También aprenderá las diferencias entre final, finalmente y finalizar.

¿Dónde se usa un bloque finalmente?

El bloque finalmente en Java se utiliza para albergar partes importantes del código, como limpiar código, cerrar un archivo o cerrar una conexión, por ejemplo. El bloque finalmente se ejecuta independientemente de si se lanza una excepción o si se maneja esa excepción. A finalmente contiene todas las declaraciones importantes, ya sea que ocurra una excepción o no.

¿Cómo se finaliza una variable en Java?

Hay 3 formas de inicializar una variable Java final:
  • Puede inicializar una variable final cuando se declara. Este enfoque es el más común.
  • Una variable final vacía se inicializa en un bloque o constructor inicializador de instancia.
  • Una variable estática final vacía se inicializa dentro de un bloque estático.

¿Podemos llamar al método de finalización manualmente en Java?

El método finalize() no es necesario y no se recomienda llamarlo cuando un objeto sale del alcance. Porque no se sabe de antemano cuándo (o si) se ejecutará el método finalize() . En general, finalizar no es el mejor método a utilizar a menos que exista una necesidad específica. A partir de Java 9 está en desuso.

¿Cuándo se llama al método de finalización?

Se llama al método finalize() para realizar la limpieza justo antes de la recolección de basura.

¿Cuál es la diferencia entre final, finalmente y finalizar?

La principal diferencia entre final, finalmente y finalizar es que final es un modificador de acceso, finalmente es un bloque en el manejo de excepciones y finalize es un método de una clase de objeto.

¿Es posible anular los métodos finales?

No, los métodos declarados finales no se pueden anular ni ocultar.

¿Podemos usar try sin catch?

Sí, es posible tener un bloque try sin un bloque catch utilizando un bloque final . Como sabemos, el bloque final siempre se ejecutará incluso si ocurre alguna excepción que no sea la del Sistema en el bloque try.

¿Cuáles son los métodos finales?

Las subclases no pueden anular ni ocultar los métodos finales. Se utilizan para evitar un comportamiento inesperado de una subclase que modifica un método que puede ser crítico para la función o la coherencia de la clase.

¿Puede un constructor ser definitivo?

Los constructores NUNCA pueden ser declarados definitivos. Su compilador siempre arrojará un error como "modificador final no permitido". Final cuando se aplica a métodos significa que el método no se puede anular en una subclase. Los constructores NO son métodos regulares.

¿Para qué se utiliza la palabra clave finalmente?

La palabra clave finalmente se utiliza para crear un bloque de código después de un bloque de prueba. El bloque finalmente siempre se ejecuta independientemente de si ocurre una excepción. El uso de un bloque finalmente le permite ejecutar cualquier declaración de tipo desenredado que desee ejecutar, independientemente de lo que esté sucediendo en el código protegido.

¿De qué sirve finalmente?

Un bloque finalmente en Java es un bloque que se utiliza para ejecutar partes de código como cerrar una conexión y otras. El bloque finalmente en Java siempre se ejecuta independientemente de que se maneje o no la excepción. Por lo tanto, contiene todas las declaraciones necesarias que deben imprimirse independientemente de que se produzca una excepción o no.

¿Por qué está protegido el método Finalize?

¿Por qué está protegido el modificador de acceso al método finalize() ? ¿Por qué no puede ser público? No es público porque nadie más que la JVM debe llamarlo. Sin embargo, debe protegerse para que las subclases que necesiten definir su comportamiento puedan anularlo.

¿Siempre se llama al método de finalización en Java?

El método de finalización se llama cuando un objeto está a punto de ser recolectado como basura. Esto puede suceder en cualquier momento después de que sea elegible para la recolección de basura. Tenga en cuenta que es muy posible que el objeto nunca sea recolectado como basura (y, por lo tanto, nunca se llame a finalize).

¿Cuál es la diferencia entre tirar y tirar?

La palabra clave throw se utiliza para lanzar intencionalmente una excepción. La palabra clave throws se utiliza para declarar una o más excepciones, separadas por comas. Cuando se usa throw, solo se lanza una excepción.

¿Cuál es la diferencia entre las palabras clave try catch y finalmente?

Estos son dos conceptos diferentes: un bloque catch se ejecuta solo si ocurre una excepción en el bloque try. El bloque finalmente siempre se ejecuta después del bloque try(-catch), independientemente de si se lanzó una excepción o no.

¿Podemos usarlo finalmente sin intentarlo en Java?

Un bloque finalmente debe estar asociado con un bloque de prueba; no puede usarlo finalmente sin un bloque de prueba. Debes colocar en este bloque aquellas sentencias que siempre deben ejecutarse.

¿Podemos heredar el método final?

¿Se hereda el método final? Sí, el método final se hereda, pero no puedes anularlo.

¿Qué método no se puede anular?

No podemos anular métodos estáticos porque la anulación de métodos se basa en enlaces dinámicos en tiempo de ejecución y los métodos estáticos están vinculados mediante enlaces estáticos en tiempo de compilación. Por lo tanto, no es posible anular los métodos estáticos.

¿Qué sucede si se anula el método final?

Un método final declarado en una clase principal no puede ser anulado por una clase secundaria. Si intentamos anular el último método, el compilador generará una excepción en el momento de la compilación.

¿La palabra clave final y el método de finalización funcionan igual?

No hay similitudes en sus funciones, salvo nombres similares. La palabra clave final se puede utilizar con una clase, método o variable en Java. Una clase final no es extensible en Java, un método final no se puede anular y una variable final no se puede modificar.

¿Cuál es la súper palabra clave en Java?

La super palabra clave en Java es una variable de referencia que se utiliza para hacer referencia al objeto inmediato de la clase principal. Cada vez que crea una instancia de una subclase, se crea una instancia de la clase principal en paralelo, a la que hace referencia la variable de referencia super. La palabra clave super se puede utilizar para llamar directamente a un método de una clase principal.

¿Cuál es la diferencia entre las palabras clave estáticas y finales?

La principal diferencia entre las palabras clave estáticas y finales es que la palabra clave estática se usa para definir un miembro de una clase que se puede usar independientemente de cualquier objeto de esa clase. La palabra clave Final se utiliza para declarar una variable constante, un método que no se puede anular y una clase que no se puede heredar.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION