Это от руководства Sun, когда они выпустили функцию (выделение в оригинале):
Поэтому, когда необходимо использовать статический импорт? Очень экономно! Только использование это, когда Вы иначе испытали бы желание объявить локальные копии констант или злоупотребить наследованием (Постоянный Интерфейсный Антишаблон).... При злоупотреблении статической функции импорта она может сделать программу нечитабельной и неудобной в сопровождении, загрязнив ее пространство имен всеми статическими участниками, которых Вы импортируете. Читатели Вашего кода (включая Вас, спустя несколько месяцев после записи этого) не будут знать, которые классифицируют статического участника, прибывает из. Импорт всех статических участников от класса может быть особенно вреден для удобочитаемости; если Вы нуждаетесь только в одном или двух участниках, импортируете их индивидуально.
( https://docs.oracle.com/javase/8/docs/technotes/guides/language/static-import.html )
существует две первых части, хотят вызвать конкретно:
extend some.package.DA
? Если так, статический импорт может быть более чистым способом обработать это. Если Вы никогда не мечтали бы о расширении some.package.DA
, то это - вероятно, плохое использование статического импорта. Не используйте его только для сохранения нескольких символов при вводе. import static some.package.DA.save
вместо DA.*
. Это сделает намного легче найти, куда этот импортированный метод прибывает из. Лично, я использовал эту функцию языка очень редко, и почти всегда только с константами или перечислениями, никогда с методами. Компромисс, для меня, почти никогда не стоит того.
Я использую их, когда когда-либо я могу. Я сделал, чтобы IntelliJ установил для напоминания мне, если я забываю. Я думаю, что это выглядит намного более чистым, чем полностью определенное имя пакета.
Необходимо использовать их когда:
switch
оператор с перечислимыми значениями Статический импорт является единственной функцией “new” Java, который я никогда не использовал, и don’t намереваются когда-либо использовать, из-за проблем, которые Вы просто упомянули.
Они полезны для сокращения формулировки, особенно в случаях, где существует много импортированных методов, называемых, и различие между локальными и импортированными методами ясно.
Один пример: код, который включает несколько ссылок на java.lang. Математика
Другой: класс разработчика XML, где, предварительно ожидая имя класса к каждой ссылке скрыло бы структуру, создаваемую
Я использую его для Цвета много.
static import java.awt.Color.*;
очень маловероятно, что цвета будут перепутаны с чем-то еще.
Эффективный Java, Второй Выпуск , в конце Объект 19 примечания, что можно использовать статический импорт при нахождении в большой степени константы использования от служебного класса. Я думаю, что этот принцип относился бы к статическому импорту и констант и методов.
import static com.example.UtilityClassWithFrequentlyUsedMethods.myMethod;
public class MyClass {
public void doSomething() {
int foo= UtilityClassWithFrequentlyUsedMethods.myMethod();
// can be written less verbosely as
int bar = myMethod();
}
}
Это имеет преимущества и недостатки. Это делает код более читаемым за счет потери некоторой информации из первых рук о том, где метод определяется. Однако хороший IDE позволит Вам перейти к определению, таким образом, это не будет большой частью проблемы.
необходимо все еще использовать это экономно, и только если Вы используете вещи из импортированного файла многие, много раз.
Редактирование: Обновленный, чтобы быть более характерным для методов, поскольку это - то, к чему относится этот вопрос. Принцип применяется независимо от того, что импортируется (константы или методы).
Я соглашаюсь, что они могут быть проблематичными с точки зрения удобочитаемости и должны использоваться экономно. Но при использовании общего статического метода они могут на самом деле увеличить удобочитаемость. Например, в тестовом классе JUnit, методы как assertEquals
очевидны, куда они происходят из. Так же для методов от java.lang.Math
.
Другое разумное использование для статического импорта с JUnit 4. В более ранних версиях методов JUnit как assertEquals
и fail
были наследованы, так как тестовый класс расширился junit.framework.TestCase
.
// old way
import junit.framework.TestCase;
public class MyTestClass extends TestCase {
public void myMethodTest() {
assertEquals("foo", "bar");
}
}
В JUnit 4, тестовые классы больше не должны расширять TestCase
и могут вместо этого использовать аннотации. Можно затем статически импортировать утверждать методы от org.junit.Assert
:
// new way
import static org.junit.Assert.assertEquals;
public class MyTestClass {
@Test public void myMethodTest() {
assertEquals("foo", "bar");
// instead of
Assert.assertEquals("foo", "bar");
}
}
JUnit документы использование его этот путь.