Що означає "статичний" модифікатор після "імпорту"?


438

При такому використанні:

import static com.showboy.Myclass;

public class Anotherclass{}

в чому різниця між import static com.showboy.Myclassі import com.showboy.Myclass?

Відповіді:


390

Див. Документація

Статична декларація про імпорт аналогічна звичайній декларації про імпорт. Якщо звичайна декларація про імпорт імпортує класи з пакетів, що дозволяє використовувати їх без кваліфікації пакунків, статична декларація про імпорт імпортує статичні члени з класів, дозволяючи використовувати їх без кваліфікації класів.

Тож коли слід використовувати статичний імпорт? Дуже щадно! Використовуйте його лише тоді, коли в іншому випадку ви б спокусилися оголосити локальні копії констант або зловживати спадщиною (постійний інтерфейс Antipattern). Іншими словами, використовуйте його, коли вам потрібен частий доступ до статичних членів з одного або двох класів. Якщо ви зловживаєте функцією статичного імпорту, вона може зробити вашу програму нечитабельною та нездійсненною, забруднивши її простір імен усіма статичними членами, які ви імпортуєте. Читачі вашого коду (включаючи вас, через кілька місяців після того, як ви його написали) не дізнаються, з якого класу походить статичний член. Імпорт усіх статичних членів з класу може бути особливо шкідливим для читабельності; якщо вам потрібно лише одного або двох членів, імпортуйте їх окремо. При належному використанні статичний імпорт може зробити вашу програму більш зрозумілою,


28
Я повністю згоден з попередженнями вище @xsl. Одним із напрямків, де це, безумовно, дуже корисно, є Джуніт Ассерт : імпорт статичного org.junit.Assert. * Для всіх ваших одиничних тестів.
BxlSofty

3
- для управління вставкою дуже довгого і не дуже привабливого файлу документації, замість того, щоб писати прості пояснення.
Błażej Michalik

@xsl Чи має бути нижня частина публікації в блоці цитат? схоже, ви його набрали.
Феррібіг

1
@Ferrybig: Це цитата з пов'язаної документації.
Джошуа Снайдер

Це як includeу Рубі!
Хлоя

227

Немає різниці між тими двома імпортами, які ви заявляєте. Однак ви можете використовувати статичний імпорт, щоб дозволити некваліфікований доступ до статичних членів інших класів. Де я мав це робити:

import org.apache.commons.lang.StringUtils;
      .
      .
      .
if (StringUtils.isBlank(aString)) {
      .
      .
      .

Я можу зробити це:

import static org.apache.commons.lang.StringUtils.isBlank;
      .
      .
      .
if (isBlank(aString)) {
      .
      .
      .

Більше ви можете побачити в документації .


57

Статичний імпорт використовується для імпорту статичних полів / методу класу замість:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

Ви можете написати:

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

Це корисно, якщо у вашому коді часто використовується константа з іншого класу та якщо статичний імпорт не є неоднозначним.

Btw, у вашому прикладі "імпортувати статичний org.example.Myclass;" не працюватиме: імпорт призначений для класу, імпорт - статичний для статичних членів класу.


37

Основна ідея статичного імпорту полягає в тому, що щоразу, коли ви використовуєте статичний клас, статичну змінну або enum, ви можете імпортувати їх і врятувати себе від певного набору тексту.

Свою точку я докладу на прикладі.

import java.lang.Math;

class WithoutStaticImports {

 public static void main(String [] args) {
  System.out.println("round " + Math.round(1032.897));
  System.out.println("min " + Math.min(60,102));
 }
}

Той самий код зі статичним імпортом:

import static java.lang.System.out;
import static java.lang.Math.*;

class WithStaticImports {
  public static void main(String [] args) {
    out.println("round " + round(1032.897));
    out.println("min " + min(60,102));
  }
}

Примітка : статичний імпорт може зробити ваш код заплутаним для читання.


4
Чи означало б це щось написати import static java.lang.Mathбез зірочки?
Кріс Міддлтон

1
@AmadeusDrZaius nope, імпорт статики призначений лише для статичних членів класу.
Гаррі

1
Хороша відповідь! Оскільки багато "новачків" читають цю публікацію, однако слід надати одне невелике попередження: не перестарайтеся зірочкою, щоб запобігти забрудненню простору імен.
goerlibe

24

різниця між "імпортувати статичний com.showboy.Myclass" та "імпортувати com.showboy.Myclass"?

Перший повинен створити помилку компілятора, оскільки статичний імпорт працює лише для імпорту полів або типів членів. (припустимо, що MyClass не є внутрішнім класом або членом шоубоя)

Я думаю, ти мав на увазі

import static com.showboy.MyClass.*;

завдяки чому всі статичні поля та члени MyClass доступні у фактичному блоці компіляції без необхідності їх кваліфікації ... як пояснено вище


14

importДозволяє Java програмісту класів доступу пакета без пакета кваліфікації.

Ця static importфункція дозволяє отримати доступ до статичних членів класу без кваліфікації класу.

importНадає доступ до класів і інтерфейс , тоді як static importзабезпечує доступ до статичних членів класу.

Приклад:

З імпортом

import java.lang.System.*;    
class StaticImportExample{  
    public static void main(String args[]){  

       System.out.println("Hello");
       System.out.println("Java");  

  }   
} 

Зі статичним імпортом

import static java.lang.System.*;    
class StaticImportExample{  
  public static void main(String args[]){  

   out.println("Hello");//Now no need of System.out  
   out.println("Java");  

 }   
} 

Дивіться також: Що таке статичний імпорт у Java 5


2

Скажімо, у вас є статичні поля та методи всередині класу, який називається MyClassвсередині пакета, який називається, myPackageі ви хочете отримати доступ до них безпосередньо, ввівши myStaticFieldабо myStaticMethodне ввівши кожен раз MyClass.myStaticFieldабоMyClass.myStaticMethod .

Примітка. Вам потрібно зробити import myPackage.MyClass або myPackage.* для доступу до інших ресурсів


1

staticМодифікатор після того, як importдля вилучення / с використанням статичних полів класу. Однією з областей, в якій я користуюсь, import staticє отримання констант з класу. Ми також можемо застосовувати import staticстатичні методи. Обов’язково введіть, import staticоскільки static importце неправильно.

Що static import в Java - JavaRevisited - Дуже хороший ресурс, про який можна дізнатися більшеimport static.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.