Исходя из опыта C и C ++, я обнаружил, что разумное использование typedef
очень полезно. Знаете ли вы о способе достижения аналогичной функциональности в Java, будь то механизм Java, шаблон или какой-то другой эффективный способ, который вы использовали?
244
public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
Ответы:
У Java есть примитивные типы, объекты и массивы и все. Нет typedefs.
источник
typedef
пересмотретьboolean
вbool
.typedef int PlayerID
которая позволяет компилятору гарантировать, что идентификаторы PlayerID не используются взаимозаменяемо с другими int, а также делает код намного более читабельным для людей. , По сути, это как перечисление, но без ограниченного набора значений.typedef MegaLongTemplateClass<With, Many, Params> IsShorten;
.typedef
не включает ничего подобного. Это просто дает другое имя для типа.int
и вам нужно изменить его наlong
, вы должны изменить его в каждом месте кода, где вы работаете с этим идентификатором. Если бы вы имелиtypedef
, вам нужно было бы только изменить его в 1 месте.Если это то, что вы имеете в виду, вы можете просто расширить класс, который вы хотели бы ввести typedef, например:
источник
typedef
имеет проблем, описанных в статье для этих поддельных классов (и они очень реальны).final
классами.Начиная с версии 1.6, в java нет typedef; вы можете создать класс-оболочку для того, что вам нужно, поскольку вы не можете создавать подклассы конечных классов (Integer, Double и т. Д.).
источник
Как уже упоминалось ранее,
в Java нет механизма определения типа.
Я также не поддерживаю «поддельные классы» в целом, но здесь не должно быть общего строгого практического правила:
если ваш код, например, снова и снова использует «родовой тип», например:
Вы должны определенно рассмотреть вопрос о наличии подкласса для этой цели.
Другой подход, который можно рассмотреть, например, иметь в своем коде замедление, подобное:
А затем используйте в своем коде NameToNumbers и задайте задачу перед компилятором (ANT / Gradle / Maven) для обработки и генерации соответствующего кода Java.
Я знаю, что для некоторых читателей этого ответа это может звучать странно, но это то, сколько фреймворков реализовали «аннотации» до JDK 5, это то, чем занимается проект lombok и другие фреймворки.
источник
Действительно, единственное использование typedef, которое переносится на Javaland, - это псевдонимы, то есть присвоение одному и тому же классу нескольких имен. То есть у вас есть класс «А», и вы хотите, чтобы «Б» относилось к тому же самому. В C ++ вы будете делать "typedef BA;"
К сожалению, они просто не поддерживают это. Однако, если вы контролируете все задействованные типы, вы МОЖЕТЕ осуществить неприятный хак на уровне библиотеки - вы либо расширяете B из A, либо B реализует A.
источник
typedef
также было бы полезно создавать псевдонимы для вызовов универсальных типов. Например:typedef A<Long,String> B;
(это может быть особый случай того, что вы описали, но он показывает привлекательность идеи немного более четко).real_t
дляdouble
иbool
дляboolean
.Возможно, это может быть другой возможной заменой:
источник
myMap
экземпляр типаMyMap
, вы можете работать с реальным HashMap, только набравmyMapInstance.value.SomeOperation()
вместоmyMapInstance.SomeOperation()
. Это раздражает, не так ли?Как отмечалось в других ответах, вам следует избегать псевдотипного антипаттерна . Тем не менее, typedefs по-прежнему полезны, даже если это не способ их достижения. Вы хотите различать разные абстрактные типы, имеющие одинаковое представление Java. Вы не хотите смешивать строки, которые являются паролями, с теми, которые являются адресами улиц, или целыми числами, которые представляют смещение, с теми, которые представляют собой абсолютные значения.
Среда проверки позволяет вам определять typedef обратно совместимым способом. Я работаю даже для примитивных классов, таких как
int
и окончательных классов, таких какString
. Он не имеет времени выполнения и не нарушает тесты на равенство.В разделе « Псевдонимы типов и определения типов» в руководстве по Checker Framework описано несколько способов создания определений типов в зависимости от ваших потребностей.
источник
Kotlin поддерживает псевдонимы типов https://kotlinlang.org/docs/reference/type-aliases.html . Вы можете переименовывать типы и типы функций.
источник
В некоторых случаях обязательная аннотация может быть именно тем, что вы ищете:
https://github.com/google/guice/wiki/BindingAnnotations
Или, если вы не хотите зависеть от Guice, может подойти обычная аннотация.
источник
Вы можете использовать Enum, хотя это семантически немного отличается от typedef тем, что он допускает только ограниченный набор значений. Другим возможным решением является именованный класс-оболочка, например
но это кажется более неуклюжим, особенно учитывая, что из кода не ясно, что у класса нет другой функции, кроме как псевдоним.
источник
Typedef позволяет неявно назначать элементы тем типам, которыми они не являются. Некоторые люди пытаются обойти это с помощью расширений; Прочитайте здесь, в IBM, чтобы объяснить, почему это плохая идея.
Редактировать: Хотя строгий вывод типов является полезной вещью, я не думаю (и надеюсь, что мы этого не сделаем) не вижу, как
typedef
поднимать эту уродливую голову на управляемых языках (когда-либо?).Редактировать 2: В C # вы можете использовать оператор использования, как это в верхней части исходного файла. Он используется, поэтому вам не нужно делать второй элемент, показанный. Единственный раз, когда вы видите изменение имени, это когда в области возникает конфликт имен между двумя типами. Переименование ограничено одним файлом, вне которого каждая используемая переменная / тип параметра известна своим полным именем.
источник
Нет необходимости в typedef в Java. Все является Объектом, кроме примитивов. Там нет указателей, только ссылки. Сценарии, в которых вы обычно используете typedef, - это экземпляры, в которых вы создаете объекты.
источник
UnmodifiableDirectedGraph<IncrediblyFancyEdgeType, IncrediblyFancyAbstractNode.EvenFancierConcreteNode>
илиIncrediblyFancyGraph
? Я всегда могу обратиться к определению, чтобы узнать, о чем оно на самом деле. Таким образом, я также могу быть уверен, что не скучаюUnmodifiableDirectedGraph<IncrediblyFancyEdge,IncredilyFancyAbstractNode.SlightlyLessFancyConcreteNode>
по чистой скуке.Enterprise
.