Есть ли преимущества использования статического импорта для импорта?

Рассмотрим следующий класс

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

Этот класс в пакете B.

Теперь я собираюсь использовать это в пакете A. Рассмотрим два способа, которыми можно воспользоваться.

Метод 1- использование import B.Constant

import B.Constant;

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

   }
  }
 }

Метод 2- использование 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")){

   }
 }
}

Мой вопрос в том, есть ли какая-либо разница или преимущество обычного импорта по статическому импорту в этом случае?

Ответы

Ответ 1

Единственное различие между нормальным import и import static заключается в том, что последнее предназначено для перемещения static членов какого-либо другого класса или интерфейса, особенно констант, в область видимости. Это зависит от вас, используете ли вы его; Мне нравится, потому что он держит тело класса короче, но YMMV.

Нет никаких преимуществ в производительности или штрафов за их использование (кроме, возможно, при компиляции, как если бы вы об этом позаботились), когда они компилируются в одинаковый байт-код.

Ответ 2

Основное отличие Readablity, Constant.USER_NAME менее читаемо по сравнению с USER_NAME.

Из Документация:

Использованный надлежащим образом статический импорт может сделать вашу программу более читаемой, удалив шаблон повторения имен классов.

Но в любом случае постарайтесь не делать

import static B.Constant.*;

потому что он может загрязнять свое пространство имен всеми статическими членами, которые вы импортируете.

Ответ 3

Я использую статический импорт очень редко и только там, где они фактически делают код немного легче следовать.

Согласно оракулу:

http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

Итак, когда вы должны использовать статический импорт? Очень экономно! Используйте его только тогда, когда в противном случае у вас возникнет соблазн объявить локальные копии констант или наследование наследования (постоянный интерфейс Antipattern). В других слова, используйте его, когда вам требуется частый доступ к статическим членам из один или два класса. Если вы злоупотребляете функцией статического импорта, она может сделать вашу программу нечитаемой и неподъемной, загрязняя ее пространство имен со всеми статическими элементами, которые вы импортируете. Читатели вашего кода (включая вас, через несколько месяцев после того, как вы его написали) не будет знать, какие класс из статического члена. Импорт всех статических элементов из класса может быть особенно опасным для удобочитаемости; если тебе надо только один или два члена, импортируйте их индивидуально. Используется надлежащим образом, статический импорт может сделать вашу программу более читаемой, удалив шаблон повторения имен классов.

Важные моменты здесь:

  • Используйте его, когда вам требуется частый доступ к статическим членам из одного или двух классов.
  • Используется соответствующим образом, статический импорт может сделать вашу программу более удобочитаемой.

И комментатор @Donal Fellows, говорит, что использование IDE для управления статическим импортом менее рискованно. Я согласен с тем, что современные средства IDE прошли долгий путь и вынесут массу проблем с управлением зависимостями и обращением метода отслеживания к родителям.

Ответ 4

Например, все методы в классе Math являются static, мы называем их Math.mathod(). Но если мы импортируем математический класс следующим образом: import static java.lang.Math.*; Нам не нужно добавлять Math перед методом:

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);
    }
}

Ответ 5

Статический импорт позволяет избегать квалифицированных статических членов с именами классов.

Как только статический член импортируется, вы можете использовать его в своем коде без префикса имени класса.

Хороший пример:

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;
}

Ответ 6

Статический импорт используются для экономии времени и ввода текста. Если вы ненавидите вводить одно и то же снова и снова, то вы можете найти такой интерес для импорта.

import позволяет java-программисту получить доступ к классам пакета без квалификации пакета.

Функция s tatic import позволяет получить доступ к статическим членам класса без квалификации класса.

Давайте рассмотрим это с помощью приведенных ниже примеров:

Пример 1: без статического импорта

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);
   }
}

Вывод:

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

Пример 2: Использование статического импорта

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);
   }
}

Вывод:

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

Ответ 7

Чтобы получить доступ к статическим членам, необходимо квалифицировать ссылки с классом, из которого они пришли. Например, нужно сказать:

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

Вы можете избежать ненужного использования статических членов класса, таких как Math. и системы. Для этого используйте статический импорт. Например, приведенный выше код при изменении с использованием статического импорта изменяется на:

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");
...

Итак, в чем преимущество использования вышеописанной техники? Единственное преимущество, которое я вижу, - это читаемость кода. Вместо того, чтобы записывать имя статического класса, можно напрямую написать имя метода или имени члена. Также помните об этом. Неоднозначный статический импорт не допускается. т.е. если вы импортировали java.lang.Math.PI и хотите импортировать mypackage.Someclass.PI, компилятор выдает ошибку. Таким образом, вы можете импортировать только один член PI.

Ответ 8

Ребята сегодня мы столкнулись с большим недостатком статического импорта. Просто поделитесь им ниже.

  • XXXConsts.java имеет EVENT_ID (EVENT_ID = "EVENT_ID" ), который был статически импортирован в классе XXXComceteImpl.java, который простирается от AbstractService.java
  • XXXZeloImpl.java, который простирается от AbstractService.java, хотел EVENT_ID = "eventId" . Поэтому EVENT_ID = "eventId" был объявлен в AbstractService.java.
  • Теперь # 1 был сломан как EVENT_ID в XXXComceteImpl.java ссылался на EVENT_ID в AbstractService.java
  • Может быть, имя EVENT_ID = "eventId" должно быть другим.
  • Примечание: - Именование классифицированных - это отредактированная версия, поэтому она выглядит необычно.