Enums e Annotations – Item 36 e 37

at_signItem 36 – Use consistentemente a anotação @Override

Crie o hábito de usar a anotação @Override em todas as sobreposições de métodos polimórficos. Isso deixara o código mais legível, fácil de ser entendido e consequentemente melhor manutenível, ajudando o compilador a também te proteger de um grande numero de erros abomináveis.

Item 37 – Use interfaces marcadoras para definir tipos

Use interfaces sem métodos denominadas “marcadores” para definir polimorfismo com o objetivo único expressar restrições específicas em tempo de compilação. Vale lembrar que o item 35 também pode ser utilizado para esse mesmo fim, caso não existe a necessidade de garantir a checagem obrigatória em tempo de compilação. Sendo assim, o programador fica livre para usar o item 35 ou 37.

Para todas as informações, veja o post inicial.

“Nem olhos viram, nem ouvidos ouviram, nem jamais penetrou em coração humano o que Deus tem preparado para aqueles que o amam.” 1 Coríntios 2:9

Enums e Annotations – Item 33, 34 e 35

imagesItem 33 – Use EnumMap em vês da indexação ordinal

Existe uma classe chamada de EnumMap feita exclusivamente para fazer indexação de matrizes de tipos Enum através de seus ordinais. Dessa forma não faça implementações caseiras relacionadas a essa necessidade. Para qualquer dúvida, consulte o Java Doc dessa classe.

Item 34 – Emule enum extensíveis com interfaces

Embora não seja possível criar tipos enum polimórficos, pode se emulá-lo criando uma interface que acompanhe um tipo básico enum que implemente essa interface. Isso permitira que os clientes criem seus próprios enums implementadores da interface, podendo ser usados sempre que o tipo enum básico pude ser usado, supondo que a programação seja criada para interfaces.

Item 35 – Prefira anotações a padrões de nomeação

A partir da versão Java 5, não existe mais a necessidade de usar padrões de nomeações para indicar elementos do programa que demandavam tratamento especial por ferramentas, frameworks e componentes. Esse tipo de pratica é totalmente sucessível a erros, falhas silenciosas e uma falta sensação de segurança. Com as anotações, é possível criar metadados específicos utilizados para indicar semânticas especiais nos elementos de programação (classes, atributos e métodos) que podem ser recuperados em tempo de execução para tratamento especial.

Para todas as informações, veja o post inicial.

“Se, porém, algum de vós necessita de sabedoria, peça-a a Deus, que a todos dá liberalmente e nada lhes impropera; e ser-lhe-á concedida.” Tiago 1:5

Enums e Annotations – Item 32

Prefira enum com EnumSet ao invés de bitwise com constantes int

Pode existir a necessidade de trabalhar com combinações bitwise de tipos enums na passagem de método no qual o objeto invocador precisara fazer combinações de várias referencias de enums simultaneamente. Para estes casos use a classe chamada de EnumSet criado especificamente para gerenciar essas determinadas particularidades.

public class Text {

public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }

public void applyStyles(Set styles) { … }

}

text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));

Para todas as informações, veja o post inicial.

“A graça do Senhor Jesus Cristo seja com o vosso espírito.” Filipenses 4:23

Enums e Annotations – Item 31

imagesPrefira valores de instâncias ao invés de valores ordinais

Pode existir a necessidade de se criar um enum e atribuir um valor específico de ordinal para cada item. Hoje no Java não existe como fazer tal operação. Para contornar o fato, crie um atributo de instância no enum e atribua um valor para cada item passando seu respectivo valor no seu construtor.

public enum Ensemble {
SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),
NONET(9), DECTET(10), TRIPLE_QUARTET(12);
   private final int numberOfMusicians;
Ensemble(int size) { this.numberOfMusicians = size; }
   public int numberOfMusicians() { return numberOfMusicians; }
}

Para todas as informações, veja o post inicial.

“E não nos cansemos de fazer o bem, porque a seu tempo ceifaremos, se não desfalecermos.” Gálatas 6:9

Enums e Annotations – Item 30

article-page-main_ehow_images_a08_5u_79_integer-value-enum-java-800x800Prefira enum ao invés de constantes int

Antes da versão Java 5 era comum o uso das abordagens chamadas de “Int Enum Pattern” e “String Enum Pattern” para representar um conjunto de constantes fixas. Essas abordagens não fornecem tipagem segura, ocasionando duplicação de nomeação, hardcode de constantes, possíveis problemas de desempenho, runtime bugs e fragilidade de código. Com a chegada do Enum, todas as deficiências existentes das abordagens citadas são solucionadas, resultando em um código mais legível, seguro e poderoso. Sendo assim, sempre prefira usar enum quando necessitar fixar um conjunto de constantes predefinidas.

Para todas as informações, veja o post inicial.

“Aquele que confessar que Jesus é o Filho de Deus, Deus permanece nele, e ele, em Deus.” 1 João 4:15

Generics – Item 29

imagesConsidere usar containers heterogêneos

Aplicações de tipos generics funcionam de forma a criar um “container homogêneo” de tipagem parametrizada. Mas existem certas circunstâncias no qual é necessário usar tipos parametrizados generics “heterogêneos”. Para isso aplique abordagem “typesafe heterogeneous container pattern”. Essa abordagem faz o uso de objetos Class<?> como token da tipagem, convertendo os tipos dinamicamente com Class<T>.cast(objeto). Veja um exemplo:

public final class Simple implements Serializable {
  private Map<Class<?>, Object> fieds = new HashMap<Class<?>, Object>();
  public  void set(Class type, T instance) {
    if (type == null) {
       throw new NullPointerException(“Type is null”);
}
fieds.put(type, instance);
}
  public T get(Class type) {
    return type.cast(fieds.get(type));
}
}

Para todas as informações, veja o post inicial.

“Aquele que não ama não conhece a Deus, pois Deus é amor.” 1 João 4:8

Generics – Item 26, 27 e 28

imagesFavoreça o uso de tipos genéricos

Escreva suas próprias classes que faça o uso de classes parametrizadas genéricos com o objetivo de oferecer flexibilidade na API e tipagem segura. Nunca deixe o cast ser feito pelo usuário da API. Sempre aplique tipagem com restrição polimórfica quando necessitar.

Favoreça o uso de métodos com tipos genéricos

Escreva métodos utilitários gerais que faça o uso de classes parametrizadas genéricos com o objetivo de oferecer flexibilidade na API e tipagem segura. Nunca deixe o cast ser feito pelo usuário da API

Use wildcards para aumentar a flexibilidade da api

Procure sempre usar wildcards na declaração das entradas dos tipos genéricos parametrizados de métodos e criação de objetos para flexibilizar ainda mais o uso sua API.  Sempre aplique restrições de “produtores” ou “consumidores” quando necessitar.

Para todas as informações, veja o post inicial.

“Antes, o seu prazer está na lei do SENHOR, e na sua lei medita de dia e de noite.” Salmos 1:2

Generics – Item 25

imagesPrefira usar listas generics ao invés de arrays

Arrays são “covariant” e “reified” significando que não existe garantia de tipagem em tempo de compilação abrindo possibilidades de erros em runtime. Listas genéricas são “invariant” e “erased” significando que ela garante tipagem em tempo de compilação, evitando quaisquer erros em tempo de runtime. Dessa forma substitua todos os arrays por listas.

Para todas as informações, veja o post inicial.

“Sabei que o SENHOR é Deus; foi ele quem nos fez, e dele somos; somos o seu povo e rebanho do seu pastoreio.” Salmos 100:3

Generics – Item 24

cup_generics-300x300Elimine todos os avisos de checagem de tipagem generics

Quando trabalhamos com generics, muitos avisos de tipagens podem ser emitidos: unchecked cast warnings, unchecked method invocation warnings, unchecked, generic array creation warnings and unchecked conversion warnings. Diante disso, elimine todos os avisos que conseguir fazer. Isso ira garantir que o código estará seguro e consequentemente sem erros de runtime.

Somente use o @SuppressWarnings(“unchecked”) para suprimir avisos no qual você tenha certeza que não ocorrera erros de runtime. Valide cada caso. Caso contrario, se terá um falsa sensação de que o código esta devidamente correto, mas com possibilidade de erros de runtime. Sempre use @SuppressWarnings(“unchecked”) localmente na situação, nunca usando ele em classes ou métodos inteiros. Se conscientize de que cada aviso de tipagens de generics representa um possível erro de  ClassCastException em runtime.

Para todas as informações, veja o post inicial.

“O SENHOR é bom para com aqueles cuja esperança está nele, para com aqueles que o buscam.” Lamentações de Jeremias 3:25

Generics – Item 23

home_img1_generic_drugsNunca deixe de fornecer os tipos para classes parametrizadas generics

O único motivo pela qual se pode criar um objeto de uma classe que receba outra classe como parâmetro genérico não informando a determinada classe parametrizada é por questões de compatibilidade retroativas da linguagem. Sendo assim, nunca deixe de fornecer a tipagem.

A passagem da classe parametrizada no generics garante segurança de tipagem pelo compilador, evitando possíveis erros de runtime. Caso exista a necessidade de trabalhar com estruturas de objetos desconhecidos em classes com classes parametrizáveis, use uma das abordagens abaixo:

  • Wildcards – usado para gerenciar estruturas que tenha parâmetros generics desconhecidos.
  • Polimorfismo – use parâmetros polimórficos de interfaces ou superclasses em estruturas genéricas desconhecidas, podendo até ser o tipo Object.

Para todas as informações, veja o post inicial.

“…e vos revistais do novo homem, criado segundo Deus, em justiça e retidão procedentes da verdade.” Efésios 4:24