declaracion java import static-import

declaracion import en java



¿Hay alguna ventaja de usar la importación estática sobre la importación? (8)

Esta pregunta ya tiene una respuesta aquí:

Considera la siguiente clase

public final class Constant { public static final String USER_NAME="user1"; //more constant here }

Esta clase en el paquete B.

Ahora voy a usar esto en el paquete A. Considere las siguientes dos formas que puede usar.

Método 1: uso import B.Constant

import B.Constant; public class ValidateUser { public static void main(String[] args) { if(Constant.USER_NAME.equals("user1")){ } } }

Método 2: usar import static B.Constant.USER_NAME;

import static B.Constant.USER_NAME; public class ValidateUser { public static void main(String[] args) { if(USER_NAME.equals("user1")){ } } }

Mi pregunta es: ¿existe alguna diferencia o ventaja en la importación normal sobre la importación estática en este caso?


La única diferencia entre una import normal y una import static es que la última es para mover miembros static de alguna otra clase o interfaz, especialmente constantes, al alcance. Depende de usted si lo usa; Me gusta porque mantiene el cuerpo de la clase más corto, pero YMMV.

No hay beneficios ni penalidades de rendimiento al usarlos (excepto posiblemente al compilar, como si te importara), ya que se compilan en un código de bytes idéntico.


La principal diferencia es Readablity , Constant.USER_NAME es menos legible en comparación con USER_NAME .

De la Documentation :

Si se utiliza de forma adecuada, la importación estática puede hacer que su programa sea más legible, eliminando la repetición de los nombres de las clases.

Pero en cualquier caso, trata de evitar hacer

import static B.Constant.*;

porque puede contaminar su espacio de nombres con todos los miembros estáticos que importa.


Para acceder a los miembros estáticos, es necesario calificar las referencias con la clase de la que provienen. Por ejemplo, hay que decir:

double r = Math.cos(Math.PI * theta); or System.out.println("Blah blah blah");

Es posible que desee evitar el uso innecesario de miembros de clases estáticas como Matemáticas. y sistema. Para ello utiliza importación estática. Por ejemplo, el código anterior cuando se modifica utilizando la importación estática se cambia a:

import static java.lang.System.out; import static java.lang.Math.PI; import static java.lang.Math.cos; ... double r = cos(PI * theta); out.println("Blah blah blah"); ...

Entonces, ¿cuál es la ventaja de usar la técnica anterior? La única ventaja que veo es la legibilidad del código. En lugar de escribir el nombre de la clase estática, uno puede escribir directamente el método o el nombre de la variable miembro. También tenga una cosa en mente aquí. La importación estática ambigua no está permitida. es decir, si ha importado java.lang.Math.PI y desea importar mypackage.Someclass.PI, el compilador generará un error. Por lo tanto, solo puede importar un miembro PI.


Por ejemplo, todos los métodos en la clase de matemáticas son estáticos y los llamamos todos como Math.mathod (). Pero si importamos una clase de matemáticas como esta: import static java.lang.Math.*; No tenemos que agregar Matemáticas antes del método:

import static java.lang.Math.*; public class Program { public static void main(String args[]) { System.out.println(sqrt(25)); System.out.println(log(100)); System.out.println(PI); } }


Utilizo importaciones estáticas muy raramente y solo cuando hacen que el código sea un poco más fácil de seguir.

Según el oráculo:

Documentation

Entonces, ¿cuándo debería usar la importación estática? ¡Muy escasamente! Solo úselo cuando, de lo contrario, estaría tentado a declarar copias locales de constantes o a abusar de la herencia (el Constant Interface Antipattern). En otras palabras, utilícelo cuando necesite acceso frecuente a miembros estáticos de una o dos clases. Si abusa de la función de importación estática, puede hacer que su programa sea ilegible y no se pueda mantener, contaminando su espacio de nombres con todos los miembros estáticos que importa. Los lectores de su código (incluido usted, unos meses después de que lo haya escrito) no sabrán de qué clase proviene un miembro estático. Importar todos los miembros estáticos de una clase puede ser particularmente perjudicial para la legibilidad; Si solo necesita uno o dos miembros, impórtelos individualmente. Si se utiliza de forma adecuada, la importación estática puede hacer que su programa sea más legible, eliminando la repetición de los nombres de las clases.

Los puntos importantes a tener en cuenta aquí:

  • Úselo cuando necesite acceso frecuente a miembros estáticos de una o dos clases
  • Usado de manera apropiada, la importación estática puede hacer que su programa sea más legible

Y el comentarista @Donal Fellows dice apropiadamente que usar un IDE para administrar las importaciones estáticas es menos riesgoso. Estoy de acuerdo, ya que los IDE modernos han recorrido un largo camino y eliminarán muchos de los problemas de la gestión de las dependencias y el método de seguimiento de las llamadas a los padres.


Chicos hoy nos encontramos con una gran desventaja de las importaciones estáticas. Solo compartiéndolo a continuación.

  1. XXXConsts.java tenía EVENT_ID (EVENT_ID = "EVENT_ID") que se importó estáticamente en una clase XXXComceteImpl.java que se extiende desde AbstractService.java
  2. XXXZeloImpl.java que se extiende desde AbstractService.java quería EVENT_ID = "eventId". Entonces, EVENT_ID = "eventId" fue declarado en AbstractService.java.
  3. Ahora # 1 se rompió porque el EVENT_ID en XXXComceteImpl.java se refería a EVENT_ID en AbstractService.java
  4. Puede ser que el nombre de EVENT_ID = "eventId" debería haber sido diferente.
  5. Nota : - La denominación de la clase clasificada se redacta, por lo que parece inusual.

Las importaciones estáticas le permiten evitar miembros estáticos calificados con nombres de clase.

Una vez que se importa el miembro estático, puede usarlo en su código sin el prefijo de nombre de clase.

Buen ejemplo:

import static sample.SampleStaticValues.NUM_ZERO; … enum OddEven {odd,even} //need not do SampleConstants.NUM_ZERO due to static import feature if(num % 2 == NUM_ZERO){ System.out.println("The num " + num + " is: " + OddEven.even); } package sample; public class SampleStaticValues { public static int NUM_ZERO = 0; public static int NUM_ONE = 0; }


Las importaciones estáticas se utilizan para ahorrar tiempo y escribir. Si odias escribir lo mismo una y otra vez, entonces puedes encontrar interesantes tales importaciones.

La importación le permite al programador de java acceder a las clases de un paquete sin la calificación del paquete.

La función de importación estática permite acceder a los miembros estáticos de una clase sin la calificación de clase.

Vamos a entender esto con la ayuda de los siguientes ejemplos:

Ejemplo 1: sin importaciones estáticas

class Demo1{ public static void main(String args[]) { double var1= Math.sqrt(5.0); double var2= Math.tan(30); System.out.println("Square of 5 is:"+ var1); System.out.println("Tan of 30 is:"+ var2); } }

Salida:

Square of 5 is:2.23606797749979 Tan of 30 is:-6.405331196646276

Ejemplo 2: Uso de importaciones estáticas

import static java.lang.System.out; import static java.lang.Math.*; class Demo2{ public static void main(String args[]) { //instead of Math.sqrt need to use only sqrt double var1= sqrt(5.0); //instead of Math.tan need to use only tan double var2= tan(30); //need not to use System in both the below statements out.println("Square of 5 is:"+var1); out.println("Tan of 30 is:"+var2); } }

Salida:

Square of 5 is:2.23606797749979 Tan of 30 is:-6.405331196646276