Java SE 7 e o futuro da linguagem Java

Propaganda
Java SE 7 e o futuro da linguagem Java
Michael Nascimento Santos
Summa Technologies do Brasil Ltda
Globalcode – Open4Education
Aviso
As informações nesta palestra correspondem a
declarações de previsão baseadas em expectativas
atuais de eventos futuros que envolvem riscos e
incertezas incluindo, sem limitação, riscos
associados a incertezas inerentes à adequação do
momento e sucesso de pesquisas ...
Globalcode – Open4Education
Agenda
>
>
>
>
>
Como o Java SE é definido
Funcionalidades consideradas para inclusão
Mudanças propostas na linguagem
O futuro da linguagem Java
Q&A
Globalcode – Open4Education
Agenda
>
>
>
>
>
Como o Java SE é definido
Funcionalidades consideradas para inclusão
Mudanças propostas na linguagem
O futuro da linguagem Java
Q&A
Globalcode – Open4Education
Definição do Java SE
(Antigamente)
> Uma “umbrella” JSR é submetida ao JCP
> A JSR já menciona algumas funcionalidades propostas
> Escolhe-se o Expert Group
> O EG discute o que deve ou não ser incluído e
isso resulta na especificação
> JSRs para APIs/mudanças da linguagem
> Pequenos bugs/alterações listadas
> A Sun faz a implementação de referência, aka
JDK
> A especificação passa por todo processo
burocrático de votação e temos uma nova
release!
Globalcode – Open4Education
Definição do Java SE hoje
> Java + YOU (por bem ou por mal)
> Apesar da burocracia, há grande influência da
comunidade
> JSRs lideradas por indivíduos
> JSR-310 (Date & Time)
> Contribuições ao OpenJDK
> Closures prototype
> Kijaro, um projeto aberto
> Blogs
> No entanto, ainda há dois grandes “guardiões”:
> Java SE: Danny Coward
> Linguagem Java: Alex Buckley
Globalcode – Open4Education
Agenda
>
>
>
>
>
Como o Java SE é definido
Funcionalidades consideradas para inclusão
Mudanças propostas na linguagem
O futuro da linguagem Java
Q&A
Globalcode – Open4Education
Próximas releases: Java SE
> Java SE 6u10 (em breve)
> Java Kernel
> Applets e aplicações tratadas de forma unificada via
JNLP com novo plugin
> Java Quick Starter
> Diversas melhorias para suportar o JavaFX
> Java SE 7 (2009?) - APIs
> Desktop (Swing Application Framework, Beans
Binding, Validation)
> NIO 2 (JSR 203)
> JPA 2.0
> Date & Time
> Melhorias no gerenciamento da VM (JMX)
Globalcode – Open4Education
Swing Application
Framework (JSR-296)
> Suporte à aplicação como conceito e seu ciclo de
vida
> Application (launch, initialize, startup, ready, exit,
shutdown)
> Configuração externa de recursos (textos, cores,
ícones)
> Sendo reconsiderado no momento
> Ações (@Action)
> Tasks, com suporte à execução assíncrona,
indicação de progresso, interrupção e bloqueio
da GUI
> Sessions, com persistência do estado da
aplicação
Globalcode – Open4Education
Swing Application
Framework (JSR-296)
public class M yApp extends SingleFram eApplication {
@ O verride protected void startup() {
JLabellabel= new JLabel("H ello W orld");
show (label);
}
public static void m ain(String[] args) {
Application.launch(M yApp.class, args);
}
}
// SingleFram eApplication é um a subclasse de Application
Globalcode – Open4Education
Swing Application
Framework (JSR-296)
ApplicationC ontext c = Application.getInstance().getContext();
ResourceM ap r = c.getResourceM ap(M yForm .class);
r.getString("aForm at", "W orld") => " Hel l o Wor l d"
r.getC olor("colorRBG A") => new Col or ( 5, 6, 7, 8)
r.getFont("aFont") => new Font ( " Ar i al " , Font . PLAI N, 12)
resources/M yForm .properties
aString = Just a string
aForm at = H ello % s
anInteger = 123
aBoolean = True
anIcon = m yIcon.png
aFont = Arial-PLAIN -12
colorRG BA = 5, 6, 7, 8
color0xRG B = # 556677
Globalcode – Open4Education
Swing Application
Framework (JSR-296)
public class M yApp extends SingleFram eApplication {
@ Action public void sayH ello() {
JLabellabel= new JLabel();
label.setN am e("label");
show (JO ptionPane.createD ialog(label));
}
@ O verride protected void startup() {
show (new JButton(getAction("sayH ello")));
}
public static void m ain(String[] args) {
Application.launch(M yApp.class, args);
}
}
# resources/M yApp.properties
sayH ello.Action.text = Say& H ello
sayH ello.Action.shortD escription = say hello
label.text = H ello W orld
m ainFram e.title = H ello
Globalcode – Open4Education
Beans Binding (JSR 295)
> Cria o conceito de Property
> Infelizmente, não algo que faça parte da linguagem
> Interface com algumas implementações convenientes
(BeanProperty, ELProperty etc)
> Permite expor “propriedades sintéticas”, como
JTextComponent.text
> Provê APIs para conversão e validação
> Binding: liga duas propriedades
> Possui extensões para facilitar o suporte Swing:
> Lists/Maps “observáveis”
> JListBinding, JTableBinding
> Um tanto quanto polêmica
Globalcode – Open4Education
Beans Binding (JSR 295)
Property fnameP = BeanProperty.create(“firstName”);
Property textP = BeanProperty.create(“text”);
Bindings.createAutoBinding(READ_WRITE,
person, fnameP,
textField, textP).bind();
Property oldP = ELProperty.create(“${age > 50}}”);
Bindings.createAutoBinding(READ,
person, oldP,
label, textP).bind();
Globalcode – Open4Education
Beans Binding (JSR 295)
Property fnP = BeanProperty.create(“firstName”);
Property lnP = BeanProperty.create(“lastName”);
JTableBinding tb =
SwingBindings.createJTableBinding(READ,
list, jtable);
tb.addColumnBinding(fnP)
.setColumnName(“First Name”)
.setColumnClass(String.class);
tb.addColumnBinding(lnP)
.setColumnName(“Last Name”);
.setColumnClass(String.class);
tb.bind();
Globalcode – Open4Education
Bean Validation (JSR-303)
> Permite restringir o valor das propriedades no
domínio através de anotações especiais
(constraints)
> Define constraints básicas (@NotNull, @Length,
@Email)
> Permite criar suas próprias anotações de constraints
(@ConstraintValidator) e como validá-las
(ConstraintValidator<A extends Annotation>)
> Permite validações de todo o bean, propriedades
individuais ou grupos
> Geração de mensagens customizadas
> Será integrada a diversos frameworks
Globalcode – Open4Education
Bean Validation (JSR-303)
public class Address {
@NotNull
@Length(max=30, message="longer than {max} characters")
private String street1;
...
@NotNull @Valid
private Country country;
}
public class Country {
@NotNull @Length(max=30)
private String name;
...
}
Globalcode – Open4Education
Bean Validation (JSR-303)
@ConstraintValidator(LengthConstraint.class)
public @interface Length {
String message() default "{beanckeck.length}";
String[] groups() default {};
int min() default 0;
int max() default Integer.MAX_VALUE;
}
public class LengthConstraint implements
Constraint<Length> {
public void initialize(Length annotation) {
}
public boolean isValid(Object value) {
}
}
Globalcode – Open4Education
NIO 2 (JSR-203)
> Nova API de suporte a filesystems
>
>
>
>
>
>
>
>
>
>
>
FileSystem
FileRef
Path
FileStore
Suporte a symbolic links
FileAttributeView
WatchService
SeekableByteChannel
Nova API de Sockets
Asynchronous I/O
Muito mais!
Globalcode – Open4Education
JPA 2.0 (JSR-317)
> Mapeamento mais flexível
> Collections de tipos básicos (wrappers, BigDecimal
etc)
> Collections de tipos embeddables (Endereco, CPF etc)
> Listas ordenadas
> Melhor suporte a Maps
> Deleção de órfãos
>
>
>
>
API para locks pessimistas
Cache API
Criteria API
Integração com validação
Globalcode – Open4Education
Date & Time API (JSR-310)
Date date = new Date(2007, 12, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/HongKong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
Date date = new Date(2007, 12, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/HongKong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
Date date = new Date(year, 12, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/HongKong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
Date date = new Date(year, 12, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/HongKong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/HongKong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/HongKong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/Hong_Kong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/Hong_Kong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/Hong_Kong");
Calendar cal = new GregorianCalendar(zone);
cal.setTime(date);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/Hong_Kong");
Calendar cal = new GregorianCalendar(zone);
cal.setTime(date);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
Date calDate = cal.getTime();
String str = fm.format(calDate);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/Hong_Kong");
Calendar cal = new GregorianCalendar(zone);
cal.setTime(date);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
Date calDate = cal.getTime();
String str = fm.format(calDate);
Globalcode – Open4Education
Date & Time API (JSR-310)
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/Hong_Kong");
Calendar cal = new GregorianCalendar(zone);
cal.setTime(date);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
fm.setTimeZone(zone);
Date calDate = cal.getTime();
String str = fm.format(calDate);
Globalcode – Open4Education
Date & Time API (JSR-310)
LocalDateTime dT = dateTime(2007, 12, 13, 16, 40);
TimeZone zone = timeZone("Asia/Hong_Kong");
ZonedDateTime date = dateTime(dt, zone);
DateTimeFormatter fm = hourMinuteZoneFormatter();
String str = fm.print(date);
Globalcode – Open4Education
Date & Time API (JSR-310)
ZonedDateTime date = builder().year(2007).december().
dayOfMonth(13).hour(16).minute(40).
timeZone("Asia/Hong_Kong").build();
DateTimeFormatter fm = hourMinuteZoneFormatter();
String str = fm.print(date);
Globalcode – Open4Education
Problemas da API atual
> Mutável
> Janeiro é 0, Dezembro é 11, mas os dias vão de
1 a 31...
> Date não é uma data
> Date usa anos a partir de 1900
> Calendar não pode ser formatado
> DateFormat não é thread-safe
> DateFormat possui um TimeZone implícito
> java.sql.{Date, Time, Timestamp} estendem Date
> Muitos conceitos não podem ser representados
Globalcode – Open4Education
Date & Time API (JSR-310)
> Modelo abrangente de data e hora
> Type-safe
> Interoperável com Date e Calendar
> Vão poder ser convertidas para as novas interfaces
> Compatível com os padrões XML e SQL
> Princípios de design:
>
>
>
>
Imutável
Fluente
Principle of Least Astonishment
Extensível
Globalcode – Open4Education
Date & Time API (JSR-310)
> Científica (Instant, Duration, Interval)
> Humana
> Tipos básicos
> LocalDate, LocalTime, LocalDateTime
> OffsetDate, OffsetTime, OffsetDateTime
> ZonedDateTime
> Campos
> Year, MonthOfYear, DayOfMonth, DayOfWeek etc.
> Regras extensíveis
> DateMatcher, TimeMatcher
> DateAdjuster, TimeAdjuster
> DateResolver
Globalcode – Open4Education
Date & Time API (JSR-310)
> Solução para o problema do horário de verão!
> Novo conceito de TimeZone
> Nome
> Offset base (ZoneOffset)
> Versão das regras de transição do offset
> (Se tudo der certo) permitirá atualização das
regras da JVM on-the-fly
> Sem quebrar objetos existentes
> Usando novas regras para objetos criados depois
Globalcode – Open4Education
Date & Time API (JSR-310)
> Periods
> Years, Months etc.
> Composições dos valores
> Nova API de formatting & parsing
> Com builders
> Interoperável com API existente
> Suporte a outros sistemas de calendário
> Suporte aos existentes no JDK
> Permitindo extensibilidade
> Nova classe para obter a hora atual: Clock
> Fácil de testar
> Permite atender requisitos de uma forma melhor
Globalcode – Open4Education
Agenda
>
>
>
>
>
Como o Java SE é definido
Funcionalidades consideradas para inclusão
Mudanças propostas na linguagem
O futuro da linguagem Java
Q&A
Globalcode – Open4Education
A linguagem Java
> Como evoluir uma linguagem estabelecida?
> Assume-se que adicionar features é algo bom
> Talvez seja para aplicações
> Linguagens precisam ser consistentes
> Se existe boxing/unboxing, por que não List<int>?
> Java tem como princípio ser backwardscompatible
> Ao mesmo tempo que permite que seu código
funcione, não permite que a evolução ocorra da forma
mais elegante possível
Globalcode – Open4Education
Princípios de evolução
> Respeitar o passado
> Novas keywords quebram o código (assert, enum)
> Features removidas quebram o código
> “Consertar” pode quebrar código também
> Respeitar o futuro
> Features que complementam features podem ser
postergadas
> Levar em conta outras potenciais adições ao definir a
sintaxe
> Respeitar o modelo atual
> Manter o foco da linguagem
> Aumentar a consistência dentro do foco
Globalcode – Open4Education
Princípios do modelo atual
>
>
>
>
Linguagem de alto nível
Clareza
Tipagem estática
Isolamento entre a linguagem e as APIs
Globalcode – Open4Education
Features e viabilidade
>
>
>
>
>
>
>
Propriedades
Reified generics
Closures & extension methods
Suporte XML
Módulos
Melhorias nas anotações
Pequenas mudanças
Globalcode – Open4Education
Propriedades
> Diversos modelos propostos
> Alterando a linguagem
> Nova API
> Combinação de ambas
>
>
>
>
Polêmica
Poucas soluções concretas desenvolvidas
Código teria que ser reescrito para tirar proveito
Chances: baixíssimas
Globalcode – Open4Education
Reified generics
>
>
>
>
>
Desejada por grande parte das pessoas
Poucas soluções propostas
Nenhum protótipo concreto, nem especificação
Requer muito esforço de implementação
Chances: baixíssimas
Globalcode – Open4Education
Closures
> Diversos modelos propostos
>
>
>
>
BGGA
FCM
CICE
NIPAD
> Muito polêmica na comunidade
> Para que código comum tirasse proveito, exigiria
reescrita ou adoção de features como extension
methods
> Chances: baixíssimas
Globalcode – Open4Education
Closures
> Diversos modelos propostos
>
>
>
>
BGGA
FCM
CICE
NIPAD (Não Implementem Pelo Amor de Deus!!!)
> Muito polêmica na comunidade
> Para que código comum tirasse proveito, exigiria
reescrita ou adoção de features como extension
methods
> Chances: baixíssimas
Globalcode – Open4Education
Suporte XML
>
>
>
>
Extremamente polêmica!
Sem protótipo disponível
Sem especificação
Chances: baixíssimas (ufa!)
Globalcode – Open4Education
Módulos
> Duas JSRs inicialmente
> 277: API e modelo de execução
> 294: Mudanças na linguagem
> Unificada recentemente na JSR-277
> Introduz conceito de restricted keyword: module
> Declaração de classes e pacotes integrante do módulo
> Declaração de dependências de outros módulos
> Novo formato de deployment (JAM)
> Potencial interoperabilidade com outros sistemas
de módulos (OSGi)
> Chances de inclusão: altas
Globalcode – Open4Education
Módulos
// org /netbeans /core/Debug g er.java
module org .netbeans .core;
packag e org .netbeans .core;
public clas s Debug g er {
... new ErrorTracker() ...
}
// org /netbeans /core/utils /ErrorTracker.java
module org .netbeans .core;
packag e org .netbeans .core.utils ;
module clas s ErrorTracker {
module int g etErrorLine() { ... }
}
// org /netbeans /core/module-info.java
@ Vers ion(" 7.0" )
@ ImportModule(name=" java.s e.core" , vers ion=" 1.7+" )
module org .netbeans .core;
Globalcode – Open4Education
Melhorias nas anotações
> Possui JSR
> Mais lugares para usar:
> List<@NonNull String>
> class UnmodifiableList<T> implements @ReadOnly
List<@ReadOnly T>
> @NonEmpty List<T> = // ...;
> Introduz a noção de tipo específico de
processador de anotação: type checker
> Não tão polêmica (talvez por não estar tão
difundida)
> Chances: média-alta
Globalcode – Open4Education
Pequenas features
> Multi-catches:
> } catch (AnException, AnotherException e) { tratar(e) }
> Safe-rethrow
> Permite fazer catch de super-tipo, mas lançar apenas
subtipos esperados
> Switch para Strings
> Chances: muito altas
Globalcode – Open4Education
Agenda
>
>
>
>
>
Como o Java SE é definido
Funcionalidades consideradas para inclusão
Mudanças propostas na linguagem
O futuro da linguagem Java
Q&A
Globalcode – Open4Education
O futuro da linguagem
> Nunca vamos ter closures, reified generics ou... ?
> A opinião está dividida:
> Alguns querem que a linguagem fique como está e a
evolução ocorra em novas linguagens para a JVM
> Alguns temem o que as pessoas farão com features
como generics
> Alguns querem que Java continue sendo uma
linguagem viva e em constante evolução
> É como o conselho mais piegas do mundo:
Globalcode – Open4Education
Depende de nós
> A comunidade precisa decidir
> A decisão final a respeito da linguagem ainda não
foi tomada
> E o melhor provavelmente deve ser um pouco da
opinião de cada parcela da comunidade
> Colabore manifestando a sua opinião
>
>
>
>
Blogs
OpenJDK
JUGs
Ou a Globalcode... :-)
Globalcode – Open4Education
Conclusão
>
>
>
>
Diversas APIs estão cogitadas para inclusão
Nem tantas mudanças de linguagem assim
Java vai manter suas características
Há certas coisas que nós nunca vamos ver em
Java - operator overloading... :-)
> O quão longe a linguagem vai evoluir e até
quando vão haver novas versões depende da
comunidade
> Faça parte da comunidade!
Globalcode – Open4Education
Obrigado!
Michael Nascimento Santos
http://blog.michaelnascimento.com.br
[email protected]
Globalcode – Open4Education
La pergunta?
Globalcode – Open4Education
Download