// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Suporte aos Processadores de Anotação no NetBeans IDE, Parte I: Utilizando o Projeto Lombok
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Suporte aos Processadores de Anotação no NetBeans IDE, Parte I: Utilizando o Projeto Lombok - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Suporte aos Processadores de Anotação no NetBeans IDE, Parte I: Utilizando o Projeto Lombok

image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0"]


* *Utilizando Projeto Lombok para Anotações Personalizadas*

Para demonstrar como as anotações personalizadas funcionam dentro do NetBeans IDE, vamos usar o Projeto Lombok, que fornece uma forma conveniente de gerar automaticamente diversos elementos de código Java, tais como getters, setters, construtores e outros. Para maiores informações sobre suas funcionalidades, visite o link:http://projectlombok.org/[+site do projeto Lombok+]. Entretanto, tenha em mente que o Projeto Lombok inclui algumas funcionalidades que podem não funcionar em todos os ambientes de desenvolvimento.

*Para concluir este tutorial, você precisa dos seguintes recursos e softwares.*

|===
|Software ou Recurso |Versão Necessária 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |7.2, 7.3, 7.4, 8.0 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 7 ou 8 

|link:http://code.google.com/p/projectlombok/downloads/list[+lombok.jar+] |v1.12.4 ou mais recente 
|===


== Criando um Novo projeto Java

Neste exercício, você cria um projeto Java simples e uma classe chamada  ``MyBooks.java``  que demonstrará as anotações em ação.

1. Escolha *Arquivo > Novo Projeto* no menu principal para abrir o assistente de Novo Projeto.
2. Selecione o tipo de projeto Aplicação Java na categoria Java. Clique em Próximo.
3. Na página Nome e Localização do assistente, digite * ``TestAnn`` * como nome do projeto.
4. Digite * ``testann.TestBooks`` * no campo Criar Classe Principal para substituir o nome default da classe. Clique em Finalizar.
image::images/newproj.png[title="Criando um novo projeto Java no NetBeans IDE"]

Quando você clica em Finalizar, o IDE cria a aplicação Java e abre a classe  ``TestBooks.java``  no editor. Você pode ver que o novo projeto está agora visível na janela Projetos e que a classe  ``TestBooks.java``  está no pacote  ``testann``  sob o nó Pacotes de Código-fonte.



. Clique com o botão direito do mouse no nó do pacote  ``testann``  na janela Projetos e escolha Novo > Classe Java.


. Digite * ``MyBooks`` * para o Nome da Classe e confirme que a classe será criada no pacote  ``testann`` . Clique em Finalizar.

Quando você clicar em Finalizar, o IDE abre a nova classe no editor.



. No editor de código-fonte, adicione os seguintes três campos em  ``MyBooks.java`` .

[source,java]
----

package testann;

public class MyBooks {   
    *private int year; //fields
    private String title;
    private String author;*

}
----


. Coloque o ponteiro do mouse na declaração da classe e pressione Ctrl-Espaço para chamar o suporte de autocompletar código do editor.


. Selecione  ``MyBooks (int year, String title, String author) - generate``  na lista autocompletar código para gerar um construtor para  ``MyBooks.java`` .
image::images/generate-constructor.png[title="Recurso autocompletar código para gerar o construtor"]


. Salve as alterações.


== Ativando Anotações Personalizadas (lombok.jar) para o Projeto

Neste exercício, você irá modificar a janela de propriedades do projeto para adicionar uma biblioteca à classpath do projeto e ativar o processamento de anotações no editor.

1. Faça download do arquivo link:http://code.google.com/p/projectlombok/downloads/list[+lombok.jar+] e salve no sistema.
2. Clique com o botão direito no nó do projeto  ``TestAnn``  e escolha Propriedades.
3. Selecione a categoria Bibliotecas na caixa de diálogo Propriedades do Projeto.
4. Clique em Adicionar JAR/Pasta na guia Compilar e localize o arquivo  ``lombok.jar``  submetido a download.
image::images/properties1.png[title="Categoria das bibliotecas na janela Propriedades"]

Os recursos adicionados à guia Compilar correspondem à opção  ``-classpath``  do link:http://download.oracle.com/javase/6/docs/technotes/tools/windows/javac.html#options[+compilador Java+]. Como  ``lombok.jar``  é um arquivo JAR único que contém definições de anotação e processadores de anotações, é recomendado adicioná-lo ao classpath do projeto, que é a guia Compilação.



. Escolha a categoria Compilação na janela Propriedades do Projeto.


. Confirme se a caixa de seleção Ativar o Processamento de Anotações está selecionada (ela é ativada por default) e selecione a caixa de seleção Ativar o Processamento de Anotações no Editor.
image::images/properties2.png[title="Categoria de compilação na janela Propriedades"]

A caixa de seleção Ativar Processamento de Anotações ativa o processamento de anotação ao construir e compilar o projeto. Se a caixa de seleção não estiver selecionada, a opção  ``-proc:none``  é passada para o compilador Java e a compilação ocorre sem qualquer processamento de anotações. Então, se deseja processar anotações no código, a caixa de seleção Ativar Processamento de Anotações deve estar selecionada.

Ao selecionar a caixa de seleção, Ativar Processamento de Anotações no Editor, você faz com que o processamento de anotações fique visível no editor. Quaisquer artefatos adicionais que forem gerados por processadores de anotações (classes, métodos, campos, etc.) ficam visíveis no editor IDE e disponíveis para a conclusão de código, no Navegador, Ir para Tipo, Localizar usos e outros.



. Clique em OK na janela Propriedades do Projeto e retorne para o arquivo  ``MyBooks.java`` .

Caso você expanda o nó Bibliotecas na janela Projetos, verá que a  ``lombok.jar``  está agora listada como uma biblioteca do projeto.

image::images/projects-window.png[title="Nó das bibliotecas na janela Projetos"]


== Escrevendo uma Aplicação com a Utilização de Anotações Personalizadas Lombok

1. No arquivo  ``MyBooks.java`` , digite  ``@Data``  antes da declaração de classe  ``MyBooks`` .  ``@Data``  é uma anotação que gera o código padronizado para classes Java: getters para todos os campos, setters para todos os campos não-finais e o  ``toString``  apropriado,  ``equals``  e implementações  ``hashCode``  que envolvem os campos da classe.

Para aprender mais sobre quais anotações são suportadas pelo Projeto Lombok, consulte a link:http://projectlombok.org/features/index.html[+Visão Geral das Funcionalidades+] do Lombok.



. Clique na dica na margem direita do editor e adicione importar para  ``lombok.Data`` .
image::images/import-lombok.png[title="Dica no editor para importar lombok"]

O código resultante no Editor deve ser parecido com o exemplo abaixo.


[source,java]
----

package testann;

import lombok.Data;


@Data
public class MyBooks {

    private int year; //fields
    private String title;
    private String author;

    public MyBooks(int year, String title, String author) {
        this.year = year;
        this.title = title;
        this.author = author;
    }
}
----

Observe que artefatos de código necessários, como getters, setters, toString, etc., têm sido gerados e é possível visualizá-los na janela do Navegador. A anotação  ``@Data``  gera todos os códigos padronizados que são necessários para uma classe típica.

image::images/nav.png[title="Janela do Navegador mostrando os membros do projeto"]

É possível também chamar a janela autocompletar código (Ctrl-Espaço) e ver que os artefatos gerados estão disponíveis para pegá-los. Agora, veremos que o projeto compila e os artefatos gerados podem ser chamados de outras partes do programa.



. Abra o arquivo  ``TestBooks.java``  com o método _main_ e adicione o código a seguir (em negrito) para criar um novo objeto da classe  ``MyBooks`` .

[source,java]
----

package testann;

public class TestBooks {

    public static void main(String[] args) {
        *MyBooks books = new MyBooks(2009, "My Beautiful Dream", "John Smith");*
    }
}
----


. Adicione o seguinte código para imprimir os valores da variável  ``books`` .

Para voltar os valores, chamamos os métodos getter que são autogerados por  ``lombok.jar`` . Enquanto estiver digitando, observe que os artefatos autogerados estão disponíveis da janela autocompletar código.


[source,java]
----

package testann;

public class TestBooks {

    public static void main(String[] args) {
        MyBooks books = new MyBooks(2009, "My Beautiful Dream", "John Smith");
        *System.out.println("Year: " + books.getYear() + ", Title: " + books.getTitle() +  ", Author: " + books.getAuthor());*
    }
}
----


. Salve as alterações.


. Clique com o botão direito do mouse no nó na janela Projetos e selecione Executar (F6).

Ao executar a aplicação, você deverá ver a seguinte saída que mostra que a aplicação foi compilada com êxito.

image::images/output.png[title="Janela de saída após a execução da aplicação"]

Você pode ver que os artefatos gerados pelo processador de anotação Lombok estão acessíveis de outras partes do programa.


== Próxima Etapa

* Documentação Java SE - link:http://download.oracle.com/javase/6/docs/technotes/guides/language/annotations.html[+Anotações+]
* Tutorial Java SE - link:http://download.oracle.com/javase/tutorial/java/javaOO/annotations.html[+Anotações+]
link:/about/contact_form.html?to=3&subject=Feedback:%20Using%20the%20Annotation%20Processors%20Support%20in%20NetBeans%20IDE[+Enviar Feedback neste Tutorial+]
