Vindo de um background C e C ++, achei o uso criterioso de typedef
ser incrivelmente útil. Você conhece uma maneira de obter funcionalidade semelhante em Java, seja um mecanismo, padrão ou outra maneira eficaz que você tenha usado?
244
public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
Respostas:
Java tem tipos primitivos, objetos e matrizes e é isso. Sem typedefs.
fonte
typedef
redefinirboolean
parabool
.typedef int PlayerID
que permite ao compilador garantir que PlayerIDs não sejam usados de forma intercambiável com outras ints, além de tornar o código muito mais legível para humanos . Basicamente, é como um enum, mas sem um conjunto limitado de valores.typedef MegaLongTemplateClass<With, Many, Params> IsShorten;
.typedef
não habilita tal coisa. Apenas fornece outro nome para um tipo.int
e precisar alterá-lo paralong
, você deve alterá-lo em todos os lugares do código em que trabalha com o ID. Se você tivessetypedef
, seria necessário alterá-lo em apenas um lugar.Se é isso que você quer dizer, você pode simplesmente estender a classe que deseja digitar, por exemplo:
fonte
typedef
não possui nenhum dos problemas descritos neste artigo para essas classes falsas (e são muito reais).final
classes.Não há typedef no java a partir da versão 1.6, o que você pode fazer é criar uma classe de wrapper para o que você deseja, pois você não pode subclassificar as classes finais (Integer, Double, etc)
fonte
Como outros já mencionaram,
não há mecanismo typedef em Java.
Eu também não apoio "classes falsas" em geral, mas não deve haver uma regra geral estrita aqui:
Se o seu código, por exemplo, usa repetidamente e repetidamente um "tipo baseado em genérico", por exemplo:
Você definitivamente deve considerar ter uma subclasse para esse fim.
Outra abordagem que se pode considerar é, por exemplo, ter em seu código uma desaceleração como:
E então use no seu código NameToNumbers e tenha uma tarefa de pré-compilador (ANT / Gradle / Maven) para processar e gerar código java relevante.
Eu sei que para alguns dos leitores desta resposta isso pode parecer estranho, mas é quantas estruturas implementadas "anotações" antes do JDK 5, é isso que o projeto lombok está fazendo e outras estruturas.
fonte
Realmente, o único uso do typedef transferido para o Javaland é o alias - ou seja, dando à mesma classe vários nomes. Ou seja, você tem uma classe "A" e deseja que "B" se refira à mesma coisa. Em C ++, você faria "typedef BA;"
Infelizmente, eles simplesmente não o suportam. No entanto, se você controla todos os tipos envolvidos, PODE acionar um hack desagradável no nível da biblioteca - você estende B de A ou implementa B de A.
fonte
typedef
também seria útil para criar aliases para invocações de tipos genéricos. Por exemplo:typedef A<Long,String> B;
(esse pode ser um caso especial do que você descreveu, mas mostra o apelo da ideia um pouco mais claramente).real_t
paradouble
ebool
paraboolean
.Talvez isso possa ser outro possível substituto:
fonte
myMap
instância do tipoMyMap
, você pode operar no HashMap real apenas digitando emmyMapInstance.value.SomeOperation()
vez demyMapInstance.SomeOperation()
. Isso é chato, não é?Conforme observado em outras respostas, você deve evitar o antipadrão padrão pseudo-tipado . No entanto, typedefs ainda são úteis, mesmo que esse não seja o caminho para alcançá-los. Você deseja distinguir entre diferentes tipos abstratos que têm a mesma representação Java. Você não deseja misturar seqüências de caracteres com senhas com endereços, ou números inteiros que representam um deslocamento com aqueles com aqueles que representam um valor absoluto.
O Checker Framework permite definir um typedef de uma maneira compatível com versões anteriores. Eu trabalho mesmo para classes primitivas como
int
e classes finais comoString
. Não possui sobrecarga de tempo de execução e não quebra os testes de igualdade.Os aliases de tipo de seção e typedefs no manual do Checker Framework descrevem várias maneiras de criar typedefs, dependendo de suas necessidades.
fonte
O Kotlin suporta aliases de tipo https://kotlinlang.org/docs/reference/type-aliases.html . Você pode renomear tipos e tipos de função.
fonte
Em alguns casos, uma anotação de ligação pode ser exatamente o que você está procurando:
https://github.com/google/guice/wiki/BindingAnnotations
Ou, se você não quiser depender do Guice, apenas uma anotação regular pode ser necessária.
fonte
Você pode usar um Enum, embora seja semanticamente um pouco diferente de um typedef, pois ele permite apenas um conjunto restrito de valores. Outra solução possível é uma classe de wrapper nomeada, por exemplo
mas isso parece muito mais complicado, especialmente porque não está claro no código que a classe não tem outra função senão como um alias.
fonte
Typedef permite que itens sejam atribuídos implicitamente a tipos que não são. Algumas pessoas tentam contornar isso com extensões; leia aqui na IBM para obter uma explicação de por que essa é uma má ideia.
Edit: Embora uma forte inferência de tipo seja uma coisa útil, eu acho que (e espero que não) veremos
typedef
elevar sua cabeça feia em idiomas gerenciados (nunca?).Edição 2: em C #, você pode usar uma instrução using como esta na parte superior de um arquivo de origem. É usado para que você não precise executar o segundo item mostrado. A única vez em que você vê a alteração de nome é quando um escopo introduz uma colisão de nome entre dois tipos. A renomeação é limitada a um arquivo, fora do qual cada tipo de variável / parâmetro que o usou é conhecido por seu nome completo.
fonte
Não há necessidade de typedef em Java. Tudo é um objeto, exceto as primitivas. Não há ponteiros, apenas referências. Os cenários em que você normalmente usaria typedefs são instâncias nas quais você cria objetos.
fonte
UnmodifiableDirectedGraph<IncrediblyFancyEdgeType, IncrediblyFancyAbstractNode.EvenFancierConcreteNode>
ouIncrediblyFancyGraph
? Sempre posso me referir à definição para descobrir do que se trata. Dessa forma, também posso ter certeza de que não sentirei faltaUnmodifiableDirectedGraph<IncrediblyFancyEdge,IncredilyFancyAbstractNode.SlightlyLessFancyConcreteNode>
do puro tédio.Enterprise
.