Novidades Java 7 - Project Coin

11 Jul 2011
3 mins read

Na semana passada estive presente na festa de lançamento do Java 7, durante o TDC 2011 e foi bem legal. Fiquei ansiosa por usar o Java 7, e decidi ir pra casa brincar um pouco com as novas features.

Fotos do evento: http://www.flickr.com/photos/loiane/sets/72157627015952961/

Vídeo do Evento (Oracle): http://blogs.oracle.com/java/entry/java_7_celebration_begins

Slides: http://blogs.oracle.com/darcy/resource/ProjectCoin/CoinLaunch.pdf

Sempre acompanhava blogs e fóruns com a lista das novidades, mas nem todas entraram para essa release. Neste post vou listar e dar exemplos das que realmente entraram.

O primeiro passo é fazer download do Java 7. Nesse caso usei Windows mesmo (:/).

Como a Oracle só vai lançar o Java de verdade no fim do mês de julho (2011), o Eclipse ainda não tem suporte nativo. Tem apenas um plugin que está na versão beta. Decidi não usar.

Vou então usar o NetBeans, que já está com suporte ao Java 7. Se você instalar o Java 7 e depois instalar o NetBeans, vai perceber que a JDK padrão já é a versão 7.

Quando criar um projeto Java no NetBeans, o compilador do projeto será Java 7, mas o compilador do código fonte ainda vai estar na versão 6. Para funcionar com o Java 7, é necessária fazer uma pequena mudança.

Vamos então começar a brincar com o Project Coin:

Strings in Switch:

Para todos os exemplo, tentei primeiro escrever o código como escrevemos hoje (Java 6) para depois tentar converter para o Java 7. O legal do NetBeans, é que ele já vem com algumas dicas de mudanças e faz isso automaticamente pra gente.

Primeiro, fiz comparação de Strings com if-else. O NetBeansme mostrou um warning sugerindo para trocar:

E se aceitar a mudança, vai trocar para:

E o código:

Antes:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testStringInSwitch(String param){

final String JAVA5 = "Java 5";
final String JAVA6 = "Java 6";
final String JAVA7 = "Java 7";

if (param.equals(JAVA5)){
System.out.println(JAVA5);
} else if (param.equals(JAVA6)){
System.out.println(JAVA6);
} else if (param.equals(JAVA7)){
System.out.println(JAVA7);
}
}
[/code]

Java7:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testStringInSwitch(String param){

final String JAVA5 = "Java 5";
final String JAVA6 = "Java 6";
final String JAVA7 = "Java 7";

switch (param) {
case JAVA5:
System.out.println(JAVA5);
break;
case JAVA6:
System.out.println(JAVA6);
break;
case JAVA7:
System.out.println(JAVA7);
break;
}
}
[/code]

Binary Literals:

Antes:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testBinaryIntegralLiterals(){

int binary = 8;

if (binary == 8){
System.out.println(true);
} else{
System.out.println(false);
}
}
[/code]

Java7:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testBinaryIntegralLiterals(){

int binary = 0b1000; //2^3 = 8

if (binary == 8){
System.out.println(true);
} else{
System.out.println(false);
}
}
[/code]

O NetBeans também dá dica para trocar um número literal para um binário literal:

Para

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testUnderscoresNumericLiterals() {

int oneMillion_ = 1_000_000;
int oneMillion = 1000000;

if (oneMillion_ == oneMillion){
System.out.println(true);
} else{
System.out.println(false);
}
}
[/code]

Underscore Between Literals:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testUnderscoresNumericLiterals() {

int oneMillion_ = 1_000_000; //new
int oneMillion = 1000000;

if (oneMillion_ == oneMillion){
System.out.println(true);
} else{
System.out.println(false);
}
}
[/code]

Diamond Syntax:

Before:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testDinamond(){

List<String> list1 = new ArrayList<String>();
Map<String, List<String>> map1 = new HashMap<String, List<String>>();
}
[/code]

Java7:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testDinamond(){
List<String> list = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
}
[/code]

O NetBeans também dá dica:

Para

Multi-Catch Similar Exceptions:

Antes:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testMultiCatch(){

try {
throw new FileNotFoundException("FileNotFoundException");
} catch (FileNotFoundException fnfo) {
fnfo.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
[/code]

Java 7:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testMultiCatch(){

try {
throw new FileNotFoundException("FileNotFoundException");
} catch (FileNotFoundException | IOException fnfo) {
fnfo.printStackTrace();
}
}
[/code]

Mesma coisa aqui. Dica para converter o código para Java 7:

Para

Try with Resources:

Antes:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testTryWithResourcesStatement() throws FileNotFoundException, IOException{

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

System.out.println(in.read());

} finally {
if (in != null) {
in.close();
}
}

}
[/code]

Java 7:

[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
public void testTryWithResourcesStatement() throws FileNotFoundException, IOException{

try (FileInputStream in = new FileInputStream("java7.txt")) {

System.out.println(in.read());

}
}
[/code]

Dica:

Para:

A simplificação de varargs também entrou na lista. Mas não entendi direito como usar. Talvez porque nunca tenha usado varargs profissionalmente em um projeto. Item para estudar mais!

Existem outras features que foram submetidas, mas não entraram nessa release:

O código apresentado neste post não é apenas teoria, já funciona no NetBeans e pode já pode ser usado em projetos. Você pode fazer o download no meu github: https://github.com/loiane/Java7HelloWorld

Um update: A DZone lançou um um RefCardz sobre NetBeans e Java 7 - o download é gratuito: http://refcardz.dzone.com/refcardz/netbeans-ide-7-programming