Только что получил комментарий, что мой статический импорт метода не был хорошей идеей. Статический импорт был методом из класса DA, который имеет в основном статические методы. Итак, в середине бизнес-логики у меня была активность da, которая, казалось, принадлежала текущему классу:
import static some.package.DA.*;
class BusinessObject {
void someMethod() {
....
save(this);
}
}
Рецензент не был заинтересован в том, чтобы я изменил код, и я не сделал, но я с ним вроде согласен. Одной из причин отказа от статического импорта была путаница в том, где был определен метод, он не был в текущем классе и не в каком-либо суперклассе, поэтому слишком долго нужно было определить его определение (система просмотра через веб не имеет кликабельности). такие ссылки, как IDE :-) Я не думаю, что это имеет значение, статический импорт все еще довольно новый, и скоро мы все привыкнем к их поиску.
Но другая причина, с которой я согласен, заключается в том, что неквалифицированный вызов метода, кажется, принадлежит текущему объекту и не должен перескакивать контекстами. Но если он действительно принадлежит, имеет смысл расширить этот суперкласс.
Итак, когда имеет смысл использовать статические методы импорта? Когда ты это сделал? Вам понравилось, как выглядят неквалифицированные звонки?
РЕДАКТИРОВАТЬ: популярное мнение, кажется, что методы статического импорта, если никто не собирается путать их как методы текущего класса. Например, методы из java.lang.Math и java.awt.Color. Но если abs и getAlpha не являются неоднозначными, я не понимаю, почему readEmployee. Как и во многих вариантах программирования, я думаю, что это тоже личное предпочтение.
Спасибо за ваш ответ, ребята, я закрываю вопрос.
источник
import static
, особенностьstatic import
Ответы:
Это из руководства 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.*
. Это значительно облегчит поиск источника импортированного метода.Лично я использовал эту языковую особенность очень редко, и почти всегда только с константами или перечислениями, никогда с методами. Для меня компромисс почти никогда не стоит.
источник
Другое разумное использование для статического импорта - JUnit 4. В более ранних версиях JUnit методы, подобные
assertEquals
иfail
унаследованные с момента расширения тестового классаjunit.framework.TestCase
.В JUnit 4 тестовые классы больше не нуждаются в расширении
TestCase
и могут вместо этого использовать аннотации. Затем вы можете статически импортировать методы assert изorg.junit.Assert
:JUnit документы, используя его таким образом.
источник
В конце статьи 19 « Эффективная Java», второе издание , отмечается, что вы можете использовать статический импорт, если вы интенсивно используете константы из служебного класса. Я думаю, что этот принцип применим к статическому импорту как констант, так и методов.
Это имеет свои преимущества и недостатки. Это делает код немного более читабельным за счет потери некоторой непосредственной информации о том, где определен метод. Однако хорошая IDE позволит вам перейти к определению, так что это не большая проблема.
Вы все равно должны использовать это экономно, и только если вы обнаружите, что используете вещи из импортированного файла много, много раз.
Изменить: Обновлено, чтобы быть более конкретным для методов, как это то, что этот вопрос относится к. Принцип применяется независимо от того, что импортируется (константы или методы).
источник
UtilityClassWithFrequentlyUsedMethods
нужно сократить.double myPI = Math.PI;
и тогда я могу просто продолжать ссылатьсяmyPI
вместоMath.PI
.Я согласен, что они могут быть проблематичными с точки зрения читабельности и должны использоваться экономно. Но при использовании обычного статического метода они действительно могут улучшить читаемость. Например, в тестовом классе JUnit такие методы
assertEquals
очевидны, откуда они берутся. Аналогично для методов изjava.lang.Math
.источник
sin x cos y + cos x sin y
. В Java становится:Math.sin(x) * Math.cos(y) + Math.cos(x) * Math.sin(y)
. Ужасно читать.using
директиву в C ++: они могут быть локальными .Я думаю, что статический импорт действительно полезен для удаления избыточных имен классов при использовании утилит, таких как
Arrays
иAssertions
.Не знаю почему, но Росс пропустил последнее предложение, которое упоминает об этом в документации, на которую он ссылается .
В основном скопировано с этого блога: https://medium.com/alphadev-blyts/static-imports-are-great-but-underused-e805ba9b279f
Так, например:
Утверждения в тестах
Это наиболее очевидный случай, с которым, я думаю, мы все согласны
Утилиты и перечисления
Имя класса может быть удалено во многих случаях при использовании утилитных классов, облегчающих чтение кода
В пакете java.time есть несколько случаев, когда его следует использовать
Пример, когда не использовать
источник
Я использую его для цвета много.
Маловероятно, что цвета будут перепутаны с чем-то другим.
источник
Я рекомендую использовать статический импорт при использовании OpenGL с Java, который представляет собой вариант использования, относящийся к «интенсивному использованию констант из служебного класса» категорий
Считают, что
позволяет переносить оригинальный код на C и писать что-то читаемое, например:
вместо этого распространенного уродства
источник
Статический импорт - единственная «новая» функция Java, которую я никогда не использовал и не собираюсь использовать из-за проблем, которые вы только что упомянули.
источник
Я использую «import static java.lang.Math. *» При переносе тяжелого математического кода из C / C ++ в java. Математические методы отображают от 1 до 1, что упрощает анализ перенесенного кода без уточнения имени класса.
источник
Я обнаружил, что это очень удобно при использовании классов Utility.
Например, вместо использования:
if(CollectionUtils.isNotEmpty(col))
Я могу вместо этого:
Какой IMO повышает читабельность кода, когда я использую эту утилиту несколько раз в моем коде.
источник
Говоря о модульных тестах: большинство людей используют статический импорт для различных статических методов, которые предоставляют макетные среды, таких как
when()
илиverify()
.И, конечно, при использовании одного-единственного утверждения, которое вы должны использовать,
assertThat()
это удобно для статического импорта требуемых совпадений подколенного сухожилия, как в:источник
Они полезны для сокращения словоблудия, особенно в тех случаях, когда вызывается много импортированных методов, и различие между локальными и импортированными методами очевидно.
Один пример: код, который включает в себя несколько ссылок на java.lang.Math
Другой: класс XML-компоновщика, в котором добавление имени класса к каждой ссылке скрывает создаваемую структуру
источник
Я думаю, что статический импорт удобен для NLS в стиле gettext.
Это помечает строку как строку, которая должна быть извлечена, и обеспечивает простой и понятный способ заменить строку ее переводом.
источник
IMO статический импорт - довольно приятная особенность. Абсолютно верно, что сильная зависимость от статического импорта делает код нечитаемым и трудно понять, к какому классу относится статический метод или атрибут. Однако, по моему опыту, это становится полезной особенностью, особенно при разработке
Util
классов, которые предоставляют некоторые статические методы и атрибуты. Неоднозначность, возникающую при предоставлении статического импорта, можно обойти, установив стандарты кода. По моему опыту работы в компании, этот подход приемлем и делает код чище и легким для понимания. Предпочтительно я вставляю . Очевидно, этот подход нарушает стандарты именования Java, но обеспечивает ясность кода. Например, если у нас есть класс AngleUtils:_
символ в передние статические методы и статические атрибуты (как-то взятые из C)В этом случае статический импорт обеспечивает ясность, а структура кода выглядит для меня более элегантно:
Сразу же кто-то может сказать, какой метод или атрибут взят из статического импорта, и он скрывает информацию о классе, которому он принадлежит. Я не предлагаю использовать статический импорт для классов, которые являются неотъемлемой частью модуля и предоставляют статические и нестатические методы, так как в этом случае важно знать, какой класс обеспечивает определенную статическую функциональность.
источник
H_
для импорта изHelper
имеющегося у меня служебного класса, илиC_
дляCommon
, илиU_
дляUtility
. В качестве альтернативы я рассмотрел возможность использования одного или двух имен символьных классов для этих широко используемых классов, но был обеспокоен тем, что они могут иногда конфликтовать с локальными именами - иметь некоторый устаревший код с именами методов в верхнем регистре.Вы должны использовать их, когда:
switch
оператор со значениями перечисленияисточник
Я использую их, когда могу. У меня есть настройки IntelliJ, чтобы напомнить мне, если я забуду. Я думаю, что это выглядит намного чище, чем полное название упаковки.
источник