Я спрашивал себя во время кодирования на Java, хорошо ли делать import static com.example.method
или лучше импортировать весь класс.
Я ограничиваюсь импортом статики в перечисления (особенно когда они широко используются в классе) и методов, когда они используются функциональными параметрами (например, Class.staticComparator());
Раньше я был большим поклонником статического импорта несколько лет назад, но теперь я запретил его везде, где только можно, даже для Assertions.*
или Mockito.*
. Причина этого в том, что не все имена подходят для статического импорта (например, of
, forName
, valueOf
); импорт одного класса не вызывает (больших) (git) различий при добавлении/удалении многих статических импортов; статический импорт может конфликтовать и выглядеть неоднозначно (например, getInstance
, valueOf
). Имена с префиксом класса сохраняют контекст (например, сравните: SECOND
- это значение перечисления из TimeUnit
или оно приходит как константа откуда-то еще?)
@fluffy Контекст имеет большое значение. Некоторые DSL, например, легко читаются при статическом импорте.
Еще один аргумент за то, чтобы не использовать статический импорт, а теперь только как личное предпочтение, заключается в том, что у меня есть схема подсветки синтаксиса насыщенными цветами, так что типы (но явно для классов, интерфейсов, абстрактных классов и перечислений) распознаются как своего рода красочный маркер контекста, чтобы не путать с (статическим) членом вызывающего класса или статически импортированным членом (я думаю, что моя IDE должна предоставить возможность выделения статического импорта, но именно так я сохраняю удобочитаемость для мне).
Зависит от контекста, не существует явного правила для использования во всех случаях. Но наиболее распространенное использование — это когда вы делаете тест и вам нужно импортировать классы, такие как Assert.* или Mockito.*, чтобы много раз не повторять Assertion.assertEquals, хорошей идеей будет сделать что-то вроде этого:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ErrorsControllerImplTest {
@Test
void should_return_all_the_errors_types() {
ErrorsController controller = new ErrorsControllerImpl();
assertAll(
() -> assertEquals(58, controller.getAllErrors().size()),
() -> assertEquals("BadRequestStatus {code=4000509, message='Site must have a value'}",
controller.getAllErrors().get(0)));
}
}
Как сказал другой пользователь, идея состоит в том, чтобы код был читаемым и удалял повторяющиеся части.
ну тут у тебя есть смысл. +1. Вот это действительно было бы полезно. Во всяком случае, я все еще ненавижу это, это дьявол.
Я согласен с вами, я не люблю его использовать. Единственное место, где я использую этот тип импорта, — это модульный тест, в остальных классах я предпочитаю понимать, что это за статический метод.
В этом случае я думаю, что импорт всего класса более нормальный. Но я бы не сказал, что импорт статического метода автоматически плох.