// 
//     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.
//

= Visão Geral do Suporte a JDK 7 no NetBeans IDE
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Visão Geral do Suporte a JDK 7 no NetBeans IDE - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Visão Geral do Suporte a JDK 7 no NetBeans IDE

O NetBeans IDE suporta as novas funcionalidades de linguagem Java 7, como o operador diamante, strings em switch, multicatch etc. Quando você usa esses construtores em seu código, o IDE os reconhece, oferece classes corretas na funcionalidade autocompletar código, destaca erros corretamente e permite corrigir a sintaxe automaticamente. Portanto, o NetBeans IDE ajuda você a escrever código compatível com a link:http://docs.oracle.com/javase/specs/jls/se7/html/index.html[+Especificação de Linguagem Java, Java SE 7 Edition+].

Neste tutorial, você aprende como o IDE trata as construções do idioma Java 7.


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


*Para concluir este tutorial, você precisa do software e dos recursos apresentados na tabela a seguir.*

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

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |versão 7.4 ou 8.0 

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


== Garantindo que o JDK 7 esteja Registrado no NetBeans IDE

Para verificar se o JDK 7 está registrado no NetBeans IDE:

1. No IDE, selecione Ferramentas > Plataformas Java no menu principal.
2. Certifique-se de que o JDK 1.7 tenha sido escolhido na lista de Plataformas da caixa de diálogo Gerenciador de Plataformas Java.

[.feature]
--
image::images/platform-small.png[role="left", link="images/platform.png"]
--



. Clique em Fechar.


== Verificando a Configuração do Projeto

Para verificar se seu projeto está configurado para usar o JDK registrado para compilação, execução e depuração:

1. Crie um projeto Java escolhendo Arquivo > Novo Projeto e selecionando Aplicação Java como o tipo de projeto.
2. Clique em Próximo.
3. Digite  ``SwitchTest``  como nome do projeto e especifique sua localização.
4. Clique em Finalizar.
5. Na janela Projetos, clique com o botão direito do mouse no nó do projeto  ``SwitchTest``  e selecione Propriedades > Bibliotecas. Nesta guia, certifique-se de que JDK 1.7 esteja selecionado na lista de Plataformas Java.

[.feature]
--
image::images/props-libs-small.png[role="left", link="images/props-libs.png"]
--



. Alterne para a guia Códigos-fonte da janela Propriedades do Projeto e certifique-se de que JDK 7 tenha sido escolhido como o formato do Código-fonte/Binário.

[.feature]
--
image::images/props-sources-small.png[role="left", link="images/props-sources.png"]
--



. Clique em OK para fechar a caixa de diálogo Propriedades do Projeto. Seu projeto está configurado para reconhecer os recursos do idioma do Java 7.


== Usando Novos Construtores de Linguagem do JDK 7: Instrução de Alternância

O JDK 7 traz uma série de link:http://openjdk.java.net/projects/jdk7/features/[+novas funcionalidades e melhorias+] em diferentes áreas, incluindo internacionalização, E/S e rede, segurança etc. A melhor forma de ilustrar o suporte ao JDK 7 pelo Editor Java do IDE é demonstrando algumas das alterações de linguagem introduzidas pelo Projeto Coin.

Uma dessas alterações é um "String em uma alternância". Nas versões anteriores do Java, o argumento de  ``switch``  só podia ser um dos seguintes tipos de dados primitivos:  ``byte`` ,  ``short`` ,  ``char`` ,  ``int``  ou  ``enum`` . A partir do JDK 7, é possível usar argumentos do tipo  ``String``  na expressão de uma instrução  ``switch`` .

1. Abra  ``SwitchTest.java``  e adicione o código a seguir. Essa pequena amostra exibe códigos RGB para várias cores. 
Com o JDK 7, a variável  ``color``  pode ser uma  ``String`` .

[source,java]
----

package switchtest;

    public class SwitchTest {

    public static void main(String[] args) {

        String color = "red";
        String colorRGB;
        switch (color.toLowerCase()) {
            case "black": colorRGB = "000000"; break;
            case "red": colorRGB = "ff0000"; break;
            case "green": colorRGB = "008000"; break;
            case "blue": colorRGB = "0000ff"; break;
            default: colorRGB = "Invalid color"; break;
        }
        System.out.println(colorRGB);
        }
    }

----

Se o código colado for incorretamente colado no editor, pressione Alt-Shift-F para reformatar.



. Na janela Projetos, clique com o botão direito do mouse no nó do projeto e selecione Executar Arquivo. Você verá a saída da aplicação, que é o código RGB para a cor vermelha. 
Você pode ver que a construção foi bem-sucedida e que a aplicação funciona quando a plataforma de destino e o formato do código-fonte são JDK 7.

image::images/output.png[]



. Vamos reverter para o uso do JDK 6 e testar como a aplicação é compilada com o compilador do JDK 6. 
Na janela Projetos, clique com o botão direito do mouse no nó do projeto e selecione Propriedades. Na categoria Códigos-fontes, defina o Formato Código-fonte/Binário para  ``JDK 6``  e clique em OK.
Você pode ver imediatamente que o parser do JDK6 não reconhece a sintaxe. A compilação falha por causa do tipo de variável incompatível.

[.feature]
--
image::images/error-small.png[role="left", link="images/error.png"]
--



. Agora, vamos reescrever o código usando a instrução  ``if-then-else`` , em vez de  ``switch`` , como segue:

[source,java]
----

package switchtest;

    public class SwitchTest {

    public static void main(String[] args) {

        String color = "red";
        String colorRGB;
        if (color.equals("black")) {
            colorRGB = "000000";
        } else if (color.equals("red")) {
            colorRGB = "ff0000";
        } else if (color.equals("green")) {
            colorRGB = "008000";
        } else if (color.equals("blue")) { 
            colorRGB = "0000ff";
        } else {
            colorRGB = "Invalid color";
        }
        System.out.println(colorRGB);
        }
    }

----
Com o JDK 7 no formato de Código-fonte/Binário, o IDE reconhece tais casos e oferece a opção de convertê-los para  ``switch`` , conforme mostrado na figura abaixo.

[.feature]
--
image::images/convert-small.png[role="left", link="images/convert.png"]
--

Clique na dica e o construtor  ``if-then-else``  será automaticamente convertido para exatamente o mesmo  ``switch``  que tínhamos antes.


== Suporte a JDK 7: Mais Exemplos

Para demonstrar como o Editor Java do IDE reconhece e automaticamente corrige o código para que seja compatível com a especificação de linguagem do JDK 7, vamos usar um snippet de código simulado, que não tem finalidade, mas contém todas as grandes melhorias da linguagem.

Ao percorrer esse snippet de código simulado e aplicar as dicas do editor, você verá os exemplos a seguir de como:

* Tirar vantagem da inferência automática de tipo, quando o compilador Java consegue inferir o tipo de uma instância genérica sem a necessidade de especificá-la explicitamente. O _operador diamante_ é usado para sinalizar o caso de inferência de tipo.
* Usar o tratamento aprimorado de exceção, ou _multi-catch_, quando um bloco  ``catch``  pode ser usado para vários tipos de exceções. 
* Usar a nova sintaxe das instruções de fechamento de funcionalidades, introduzida pela funcionalidade de gerenciamento automático de funcionalidades.

1. Substitua o código anterior da aplicação no mesmo arquivo  ``SwitchTest.java``  pelo seguinte código:

[source,java]
----

package switchtest;


import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class SwitchTest {

    public void test() throws IOException {
        List<String> list = new ArrayList<String>();
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        HashMap<String, Integer> map2 = new HashMap<String, Integer>();
        String a = "ehlo";

        try {
            Method m = Object.class.getMethod("toString");
            m.invoke(this);
        } catch(NoSuchMethodException e) {
            e.printStackTrace();
        } catch(InvocationTargetException e) {
            e.printStackTrace();
        } catch(IllegalAccessException e) {
            e.printStackTrace();
        }

        FileInputStream in = null;
        try {
            in = new FileInputStream("foo.txt");

            int k;
            while ((k = in.read()) != -1) {
                System.out.write(k);
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
}
 
----


. Observe que o IDE exibe diversas dicas, como mostrado acima neste tutorial, de como é possível otimizar seu código para a especificação JDK 7. Basta clicar em cada dica e selecionar a ação sugerida. 


. Finalmente, depois de aceitar todas as sugestões, você deverá ter o código compatível com JDK 7 mostrado abaixo.

[.feature]
--
image::images/converted-small.png[role="left", link="images/converted.png"]
--

link:/about/contact_form.html?to=3&subject=Feedback: Overview of JDK 7 Support in NetBeans IDE[+Enviar Feedback neste Tutorial+]



== Consulte Também

Para obter mais informações sobre o JDK 7 e o NetBeans IDE, consulte:

* link:http://www.oracle.com/pls/topic/lookup?ctx=nb7400&id=NBDAG465[+Definindo o JDK de Destino+] em _Desenvolvendo Aplicações com o NetBeans IDE_
* link:http://download.oracle.com/javase/tutorial/essential/io/fileio.html[+Os Tutoriais do Java: E/S de Arquivos+] - uma seção nos tutoriais do Java que contém numerosos exemplos das mudanças do JDK 7 em E/S.
* link:http://download.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html[+Os Tutoriais do Java: Fork e Join+] - explicação no novo framework de fork/join no JDK7.

Para obter mais informações sobre o desenvolvimento de aplicações Java no NetBeans IDE, veja:

* link:javase-intro.html[+Desenvolvendo Aplicações Java Gerais+]
* link:../../trails/java-se.html[+Trilha de Aprendizado do Desenvolvimento Geral em Java+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG366[+Criando Projetos Java+] em _Desenvolvendo Aplicações com o NetBeans IDE_
