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