Java SE 7 Preview
                        Alex Miller




  Blog:    http://tech.puredanger.com
  Twitter: http://twitter....
History
                                                                      Nov, 2008
Feb, 2002                Sept, 200...
Full Menu
Modularity                                     Types and Generics
•    Project Jigsaw                           ...
Who Decides?

      Danny Coward

       ...and of course the
       Java SE 7 JSR
       Expert Group
Status du jour
Modularity                                     Types and Generics
•    Project Jigsaw YES                  ...
Focus
Modularity                         JMX
• Project Jigsaw                   • JSR 255 JMX 2.0
• JSR 294 Superpackages ...
Java Modularity


•   JSR 294: http://jcp.org/en/jsr/detail?id=294
•   Project: http://openjdk.java.net/projects/
    modu...
JAR Hell
Jar Hell in Action



Dependency management is one of the
most important (and challenging) features
of modern software dev...
Module Development
org.foo


                     // org/foo/api/FooFighters.java:
      org.foo.api
                     ...
Module Development
org.foo


                     // org/foo/impl/FooFightersImpl.java:
      org.foo.api
                ...
Module Development
                     // org/foo/module-info.java:
org.foo
                     @Version(“2.3”)
        ...
Packaging
javac ...   // as usual

jam cvf org.foo-2.3.jam
  org/foo/*
  org/foo/api/*
  org/foo/impl/*
  org/foo/domain/*...
JAM Contents
/META-INF/MANIFEST.MF             // Normal jar manifest
/MODULE-INF/MODULE.METADATA       // Module metadata...
Module Resolution
           Module A                     Bootstrap   Bootclasspath
             (1.0)


                 ...
Project Jigsaw

• Modularize the JDK itself
• Integrate at low level
• Integrate with native packaging
• NOT a JSR but par...
NIO 2


•   JSR 203: http://jcp.org/en/jsr/detail?id=203
•   Project: http://openjdk.java.net/projects/nio
NIO 2 Themes

• New file system API
• Asynchronous I/O on sockets and files
• Completion of socket channel work
java.io.File problems
• Many methods return boolean
• No copy / move support
• No symbolic link support
• No change notific...
New file system API

• FileRef - represents file object in system
• Path - extends FileRef, binds a file to a
  system-depend...
File System API
                                                          AttributeView
 WatchKey      WatchEvent


      ...
Using Path
import java.nio.file.*;

// FileSystems -> FileSystem -> Path
FileSystem fileSystem = FileSystems.getDefault();...
Appending to a file
import java.io.*;
import java.nio.file.*;
import static java.nio.file.StandardOpenOption.*;

Path journ...
Copying and Moving

import java.nio.file.*;

Path home = Paths.get(quot;/Users/amillerquot;);
Path secrets = home.resolve(...
Walking Directories
Path music = Paths.get(quot;/Users/amiller/files/musicquot;);

// External iterator
DirectoryStream<Pa...
Recursive Walk
Path itunes =
  Paths.get(quot;/Users/amiller/Music/iTunes/iTunes Musicquot;);

public class Mp3Visitor ext...
File Attributes
Path file = Paths.get(“/usr/bin/perl”);

// true here means follow symbolic links
BasicFileAttributes attr...
Watchers
import static java.nio.file.StandardWatchEventKind.*;

Path deploy = Paths.get(“deploy”);
WatchService watcher=Fi...
What else?
•   NetworkChannel

    •   finish work on channel to network socket

•   Multicasting

    •   DatagramChannel ...
Date & Time

•   JSR 310: http://jcp.org/en/jsr/detail?id=310
•   Project: https://jsr-310.dev.java.net
•   Wiki: http://w...
A simple example
Date xmasEve = new Date(2008, 12, 25, 23, 59, 59);

Is this right?
A simple example
Date xmasEve = new Date(2008, 12, 25, 23, 59, 59);

Is this right?



NO!
Correction:
int year = 2008 - 1...
Other Problems
•   Date, Calendar, SimpleDateFormatter are mutable

•   TimeZone.getInstance() exception handling

•   Gre...
Continuous
Instants, Intervals, and
         Durations
// Create some instants in seconds
Instant start2008 = Instant.instant(1199167...
Human


 +
Local*, Offset*, Zoned*
// Local human-scale (not tied to TimeZone or Instant)
LocalDate myBirthday =
  LocalDate.date(197...
Clock
// Use pre-defined system clock usually
Clock clock = Clock.system();

// Create instant
Instant now = clock.instant...
Controlling time

LocalDateTime y2k = LocalDateTime.dateTime(
  1999, MonthOfYear.DECEMBER, 31,
  23, 59, 59, 999999999);
...
Other cool stuff

• Matchers, Adjusters, Resolvers
• Full time zone rule support
• Periods: “8 years, 2 months”
• Formatti...
Integration

• Date, Calendar, etc - retrofit with interfaces
• JDBC - map to SQL types
• XML Schema - based on same standa...
Fork / join


•   JSR 166y: http://jcp.org/en/jsr/detail?id=166
•   Project: http://gee.cs.oswego.edu/dl/
    concurrency-...
Divide and Conquer




  Task: Find max value in an array
Divide and Conquer
Divide and Conquer
Divide and Conquer
ParallelArray

import static Ops.*;

ForkJoinPool fj = new ForkJoinPool(10);
Order[] data = ...
ParallelArray<Order> order...
ParallelArray
import static Ops.*;

// Filter
Ops.Predicate<Order> isLate = new Ops.Predicate<Order>() {
  public boolean ...
ParallelArray

SummaryStatistics<Integer> summary =
  orders.withFilter(isLate)
        .withMapping(daysOverdue)
        ...
Swing App Framework


•   JSR 296: http://jcp.org/en/jsr/detail?id=296
•   Project: https://appframework.dev.java.net/
Swing Application
        Framework
   Application
initialize(String[])
startup()               Action    Application
    ...
Beans Validation


•   JSR 303: http://jcp.org/en/jsr/detail?id=303
Constraints and
        Validators

• JavaBeans property validation
• Meta-annotation for defining constraint
  annotations...
Constraints
@ZipCodeCityCoherenceChecker   // works on Address itself
public class Address {
  @NotNull @Length(max=30)
  ...
Validation
Validator<Address> addressValidator = ...
Address address = ...

// Validate all properties
Set<InvalidConstrai...
JMX 2.0

•   JSR 255: http://jcp.org/en/jsr/detail?id=255
•   JSR 262: http://jcp.org/en/jsr/detail?id=262
•   Project: ht...
Features
•   JMX 2.0 (JSR 255)

    •   Retrofit with generics

    •   Use annotations

    •   Make Open MBeans easier to...
Language Changes


•   Project Coin
Strings in switch
static boolean isStooge(String stooge) {
  switch(input) {
    case “Moe”:
    case “Curly”:
    case “L...
Enum Comparisons
enum Rank {
  LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL
}
Enum Comparisons
enum Rank {
  LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL
}


// Compare using either compareTo() or ord...
Enum Comparisons
enum Rank {
  LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL
}


// Compare using either compareTo() or ord...
Chained Invocation
// Construction with setters
DrinkBuilder margarita = new DrinkBuilder();
margarita.add(“tequila”);
mar...
Chained Invocation
// Construction with setters
DrinkBuilder margarita = new DrinkBuilder();
margarita.add(“tequila”);
mar...
Extension Methods
// I wish List had a sort() method...
List list = new ArrayList();
...
Collections.sort(list);   // work...
Extension Methods
// I wish List had a sort() method...
List list = new ArrayList();
...
Collections.sort(list);   // work...
Exception boilerplate
// too much boilerplate!!!
} catch(RedException e) {
  LOGGER.info(e.getMessage(), e);
  throw e;
} ...
Exception boilerplate
// too much boilerplate!!!
} catch(RedException e) {
  LOGGER.info(e.getMessage(), e);
  throw e;
} ...
Multi-catch
public void foo()
throws RedException, BlueException {

    try {
      ...

    // Use , to catch multiple ty...
Safe Rethrown
public void foo()
throws RedException, BlueException {

    try {
      ...

    } catch(final Throwable e) ...
Null Handling
Car car = ...
Integer tilt = null;
if(car != null) {
  Sunroof sunroof = car.getSunroof()(;
  if(sunroof != ...
Type Inference

Map<String, Integer> map =
  new HashMap<String, Integer>();




Map<String, Integer> map =
  new HashMap<...
JVM

• Dynamic language support (JSR 292)
 • Method handles
 • Interface injection?
 • Tail recursion?
• G1 garbage collec...
Favorites?

What was your favorite library change?
What was your favorite language change?
What’s missing?
Learn more...


• http://tech.puredanger.com/java7
• http://java7.tumblr.com
Find Me...


• http://tech.puredanger.com
• Twitter: @puredanger
Upcoming SlideShare
Loading in …5
×

Java 7 Preview

8,344 views

Published on

A preview of likely features that will be included in Java 7 / JDK 7. Note that this presentation is from February 2009 and things are changing quickly.

Published in: Technology, Education
1 Comment
7 Likes
Statistics
Notes
  • Give a look at below ppt as well for Java 7 language features
    http://www.slideshare.net/shivamvds/java-7-new-features-10520056
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
8,344
On SlideShare
0
From Embeds
0
Number of Embeds
4,004
Actions
Shares
0
Downloads
320
Comments
1
Likes
7
Embeds 0
No embeds

No notes for slide

Java 7 Preview

  1. 1. Java SE 7 Preview Alex Miller Blog: http://tech.puredanger.com Twitter: http://twitter.com/puredanger
  2. 2. History Nov, 2008 Feb, 2002 Sept, 2004 Dec, 2006 Java SE 6 ?? J2SE 1.4 J2SE 5.0 Java SE 6 Update 10 Java SE 7 2002 2003 2004 2005 2006 2007 2008 2009 2010 assert generics scripting support Java Kernel regular expressions annotations JAX-WS Java Quick Starter IPv6 autoboxing Java compiler API Nimbus LAF NIO enumerations pluggable annotations Java Plugin NG Logging API synth LAF SwingWorker, etc Image I/O API enhanced for loop XML/XSLT varargs Security/crypto Java Memory Model Java Web Start concurrent library static imports
  3. 3. Full Menu Modularity Types and Generics • Project Jigsaw • Reified Generics • JSR 294 Superpackages • Type Literals Libraries • JSR 308 Annotations on Java Types • JSR 203 NIO2 • Type Inference • JSR 275 Units and Quantities Language Proposals • JSR 310 Date and Time API • Closures • JSR 166 Concurrency Utilities • Automatic Resource Mgmt Blocks • JSR 225 XQuery API for Java • Language level XML support • JSR 284 Resource Consumption Mgmt • JavaBean property support Swing • BigDecimal operator support • JSR 296 Swing Application Framework • Strings in switch statements • JSR 295 Beans Binding • Comparisons for Enums • JSR 303 Beans Validation • Chained invocation • Java Media Components • Extension methods JMX • Improved catch • JSR 255 JMX 2.0 • Null handling improvements • JSR 262 Web Services Connector JVM • invokedynamic Tools • JSR 326 Post-mortem JVM Diagnostics API • Tiered compilation • JSR 260 Javadoc Update • G1 garbage collector
  4. 4. Who Decides? Danny Coward ...and of course the Java SE 7 JSR Expert Group
  5. 5. Status du jour Modularity Types and Generics • Project Jigsaw YES • Reified Generics NO • JSR 294 Superpackages YES • Type Literals NO Libraries • JSR 308 Annotations on Java Types YES • JSR 203 NIO2 YES • Type Inference YES? • JSR 275 Units and Quantities NO? Language Proposals • JSR 310 Date and Time API HMM • Closures NO • JSR 166 Concurrency Utilities YES • Automatic Resource Mgmt Blocks NO • JSR 225 XQuery API for Java YES? • Language level XML support NO • JSR 284 Resource Consumption Mgmt NO • JavaBean property support NO Swing • BigDecimal operator support NO • JSR 296 Swing Application Framework YES • Strings in switch statements HMM • JSR 295 Beans Binding NO • Comparisons for Enums HMM • JSR 303 Beans Validation HMM • Chained invocation HMM • Java Media Components YES? • Extension methods HMM JMX • Improved catch YES? • JSR 255 JMX 2.0 YES • Null handling improvements YES? • JSR 262 Web Services Connector YES JVM • invokedynamic YES Tools • JSR 326 Post-mortem JVM Diagnostics HMM • Tiered compilation HMM • JSR 260 Javadoc Update NO • G1 garbage collector YES • Compressed pointer 64 bit VM YES
  6. 6. Focus Modularity JMX • Project Jigsaw • JSR 255 JMX 2.0 • JSR 294 Superpackages • JSR 262 Web Services Libraries Connector • JSR 203 NIO2 Language Proposals • JSR 310 Date and Time API • Strings in switch • JSR 166 Concurrency Utilities • Comparisons for Enums Swing • Chained invocation • JSR 296 Swing Application • Extension methods Framework • Improved catch • JSR 303 Beans Validation • Null handling • Type Inference JVM • invokedynamic
  7. 7. Java Modularity • JSR 294: http://jcp.org/en/jsr/detail?id=294 • Project: http://openjdk.java.net/projects/ modules
  8. 8. JAR Hell
  9. 9. Jar Hell in Action Dependency management is one of the most important (and challenging) features of modern software development
  10. 10. Module Development org.foo // org/foo/api/FooFighters.java: org.foo.api module org.foo; package org.foo.api; org.foo.domain public class FooFighters { public static FooFighters newBand() { org.foo.impl return new org.foo.impl.FooFightersImpl(); } } org.foo.util
  11. 11. Module Development org.foo // org/foo/impl/FooFightersImpl.java: org.foo.api module org.foo; package org.foo.impl; org.foo.domain module class FooFightersImpl implements FooFighters { org.foo.impl // etc } org.foo.util
  12. 12. Module Development // org/foo/module-info.java: org.foo @Version(“2.3”) @MainClass(“org.foo.Foosball”) @ImportModules { org.foo.api @ImportModule(name=”java.se.core”, version=”1.7+”) @ImportModule(name=”org.bar”, org.foo.domain version=”1.0”, reexport=”true”) } @ExportResources({“org/foo/icons/**}) org.foo.impl module org.foo; org.foo.util
  13. 13. Packaging javac ... // as usual jam cvf org.foo-2.3.jam org/foo/* org/foo/api/* org/foo/impl/* org/foo/domain/* org/foo/util/*
  14. 14. JAM Contents /META-INF/MANIFEST.MF // Normal jar manifest /MODULE-INF/MODULE.METADATA // Module metadata /MODULE-INF/bin/xyz-windows.dll // Native libs /MODULE-INF/bin/xyz-linux.so /MODULE-INF/bin/yyz.jar // Other jars /org/foo/module-inf.class // Compiled module info /org/foo/**.class // Normal class files /org/foo/icons // Resources
  15. 15. Module Resolution Module A Bootstrap Bootclasspath (1.0) Extension ESOM Module B Module C (2.0) (4.1) Global Classpath Module C (3.2) OSGi Maven URL
  16. 16. Project Jigsaw • Modularize the JDK itself • Integrate at low level • Integrate with native packaging • NOT a JSR but part of JDK 7
  17. 17. NIO 2 • JSR 203: http://jcp.org/en/jsr/detail?id=203 • Project: http://openjdk.java.net/projects/nio
  18. 18. NIO 2 Themes • New file system API • Asynchronous I/O on sockets and files • Completion of socket channel work
  19. 19. java.io.File problems • Many methods return boolean • No copy / move support • No symbolic link support • No change notification support • Limited support for file attributes • Not extensible
  20. 20. New file system API • FileRef - represents file object in system • Path - extends FileRef, binds a file to a system-dependent location • FileSystem - interface to file system • FileStore - underlying storage system
  21. 21. File System API AttributeView WatchKey WatchEvent File WatchService Watchable AttributeView BasicFile Named FileRef AttributeView AttributeView Directory FileSystems FileSystem Path Stream Files FileStore Paths FileVisitor Directory Directory StreamFilters Stream.Filter FileVisit Result
  22. 22. Using Path import java.nio.file.*; // FileSystems -> FileSystem -> Path FileSystem fileSystem = FileSystems.getDefault(); Path homeDir = fileSystem.getPath(“/Users/amiller”); // Shortcut with Paths helper class Path homeDir = Paths.get(“/Users/amiller”); // Resolve one path in terms of another Path relativeTemp = Paths.get(“temp”); Path absoluteTemp = relativeTemp.resolve(homeDir); // Get relative path from a base Path absoluteProfile = Paths.get(“/Users/amiller/.profile”); Path relativeProfile = absoluteProfile.relativize(homeDir); assert relativeProfile.isRelative(); assert relativeProfile.getNameCount() == 1;
  23. 23. Appending to a file import java.io.*; import java.nio.file.*; import static java.nio.file.StandardOpenOption.*; Path journal = Paths.get(quot;/Users/amiller/journal.txtquot;); OutputStream stream = journal.newOutputStream(CREATE, APPEND); try { writeEntry(stream); // normal stuff } finally { stream.close(); }
  24. 24. Copying and Moving import java.nio.file.*; Path home = Paths.get(quot;/Users/amillerquot;); Path secrets = home.resolve(quot;secrets.txtquot;); // Steal secrets secrets.copyTo(home.resolve(quot;stolenSecrets.txtquot;)); // Hide secrets secrets.moveTo(Paths.get(quot;/Users/dvader/secrets.txtquot;));
  25. 25. Walking Directories Path music = Paths.get(quot;/Users/amiller/files/musicquot;); // External iterator DirectoryStream<Path> mp3s = music.newDirectoryStream(“*.mp3”); try { for(Path entry : mp3s) System.out.println(entry.getName()); } finally { mp3s.close(); } // Internal iterator Files.withDirectory(music, “*.mp3”, new FileAction<Path>() { public void invoke(Path entry) { System.out.println(entry.getName()); } });
  26. 26. Recursive Walk Path itunes = Paths.get(quot;/Users/amiller/Music/iTunes/iTunes Musicquot;); public class Mp3Visitor extends SimpleFileVisitor<Path> { private Path root; public Mp3Visitor(Path root) { this.root = root; } public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { System.out.println(root.relativize(file)); } } Files.walkFileTree(itunes, new Mp3Visitor(itunes));
  27. 27. File Attributes Path file = Paths.get(“/usr/bin/perl”); // true here means follow symbolic links BasicFileAttributes attrs = Attributes.readPosixFileAttributes(file, true); Set<PosixFilePermission> perms = attrs.permissions(); System.out.format(quot;%s %s %squot;, PosixFilePermission.toString(perms), attrs.owner(), attrs.group()); // rwxr-xr-x root wheel
  28. 28. Watchers import static java.nio.file.StandardWatchEventKind.*; Path deploy = Paths.get(“deploy”); WatchService watcher=FileSystems.getDefault().newWatchService(); WatchKey key = deploy.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); for(;;) { key = watcher.take(); // blocks, also can poll for(WatchEvent<?> ev : key.pollEvents()) { switch(ev.kind()) { case ENTRY_CREATE: Path file = (Path)ev.getContext(); //relative to deploy // deploy new stuff case ENTRY_MODIFY: ... case ENTRY_DELETE: ... } } key.reset(); // reset after processing }
  29. 29. What else? • NetworkChannel • finish work on channel to network socket • Multicasting • DatagramChannel (now supports), • AsynchronousDatagramChannel (new) • Asynchronous I/O for files and sockets • Future or callback style • Group support - manage thread pools
  30. 30. Date & Time • JSR 310: http://jcp.org/en/jsr/detail?id=310 • Project: https://jsr-310.dev.java.net • Wiki: http://wiki.java.net/bin/view/Projects/ DateTimeAPI
  31. 31. A simple example Date xmasEve = new Date(2008, 12, 25, 23, 59, 59); Is this right?
  32. 32. A simple example Date xmasEve = new Date(2008, 12, 25, 23, 59, 59); Is this right? NO! Correction: int year = 2008 - 1900; int month = 12 - 1; Date xmasEve = new Date(year, month, 25, 23, 59, 59);
  33. 33. Other Problems • Date, Calendar, SimpleDateFormatter are mutable • TimeZone.getInstance() exception handling • GregorianCalendar time + zone constructor • Calendars can’t be formatted • java.sql.Date, Time, Timestamp subclass poorly • Formatters can’t format Timestamp nanos • Date does not represent a date
  34. 34. Continuous
  35. 35. Instants, Intervals, and Durations // Create some instants in seconds Instant start2008 = Instant.instant(1199167200); Instant start2009 = Instant.instant(1230789600); assert start2008.isBefore(start2009); // Create an interval - [inclusive, exclusive] by default InstantInterval year2008 = InstantInterval.intervalBetween(start2008, start2009); assert year2008.contains(start2008); assert ! year2008.contains(start2009); // Create a duration in seconds Duration minute = Duration.duration(60); Duration hour = minute.multipliedBy(60); Duration duration2008 = Duration.durationBetween( start2008, start2009);
  36. 36. Human +
  37. 37. Local*, Offset*, Zoned* // Local human-scale (not tied to TimeZone or Instant) LocalDate myBirthday = LocalDate.date(1974, MonthOfYear.May, 1); LocalTime quittingTime = LocalTime.time(17, 0); LocalDateTime start2008 = LocalDateTime.dateMidnight( 2008, MonthOfYear.JANUARY, 1); // Tie to time zone offset of -6 hours from UTC OffsetDateTime start2008Offset = OffsetDateTime.dateTime( start2008, ZoneOffset.zoneOffset(-6)); // Tie to current local time zone ZonedDateTime start2008Zoned = ZonedDateTime.dateTime( start2008, Clock.system().timeZone());
  38. 38. Clock // Use pre-defined system clock usually Clock clock = Clock.system(); // Create instant Instant now = clock.instant(); // Create human date / time LocalDate today = clock.today();
  39. 39. Controlling time LocalDateTime y2k = LocalDateTime.dateTime( 1999, MonthOfYear.DECEMBER, 31, 23, 59, 59, 999999999); ZonedDateTime y2kHere = ZonedDateTime.dateTime( y2k, Clock.system().timeZone() ); Instant y2kInstant = y2kHere.toInstant(); // Mock around the Clock to test y2k transition Clock clock = new my.test.ControlTimeClock(y2kInstant);
  40. 40. Other cool stuff • Matchers, Adjusters, Resolvers • Full time zone rule support • Periods: “8 years, 2 months” • Formatting and parsing
  41. 41. Integration • Date, Calendar, etc - retrofit with interfaces • JDBC - map to SQL types • XML Schema - based on same standard so should be straightforward
  42. 42. Fork / join • JSR 166y: http://jcp.org/en/jsr/detail?id=166 • Project: http://gee.cs.oswego.edu/dl/ concurrency-interest/index.html
  43. 43. Divide and Conquer Task: Find max value in an array
  44. 44. Divide and Conquer
  45. 45. Divide and Conquer
  46. 46. Divide and Conquer
  47. 47. ParallelArray import static Ops.*; ForkJoinPool fj = new ForkJoinPool(10); Order[] data = ... ParallelArray<Order> orders = new ParallelArray(fj, data);
  48. 48. ParallelArray import static Ops.*; // Filter Ops.Predicate<Order> isLate = new Ops.Predicate<Order>() { public boolean op(Order o) { return o.due() < new Date(); } }; // Map Ops.Predicate<Order> daysOverdue = new Ops.ObjectToInt<Order>() { public int op(Order o) { return daysOverdue(o.due()); } };
  49. 49. ParallelArray SummaryStatistics<Integer> summary = orders.withFilter(isLate) .withMapping(daysOverdue) .summary(); System.out.println(“overdue: “ + summary.size()); System.out.println(“avg by: “ + summary.average());
  50. 50. Swing App Framework • JSR 296: http://jcp.org/en/jsr/detail?id=296 • Project: https://appframework.dev.java.net/
  51. 51. Swing Application Framework Application initialize(String[]) startup() Action Application @Action shutdown() Manager ActionMap exit() SingleFrame Resource Resource Resource Application Manager Map Converter Session Storage Application Context Local Storage SwingWorker Task Task Task Monitor Service
  52. 52. Beans Validation • JSR 303: http://jcp.org/en/jsr/detail?id=303
  53. 53. Constraints and Validators • JavaBeans property validation • Meta-annotation for defining constraint annotations • Core Constraint classes
  54. 54. Constraints @ZipCodeCityCoherenceChecker // works on Address itself public class Address { @NotNull @Length(max=30) private String addressline1; @Length(max=30) private String addressline2; private String zipCode; private String city; @NotNull @Valid // check object graph private Country country; @Length(max=30) @NotNull public String getCity() { ... } // normal getters and setters }
  55. 55. Validation Validator<Address> addressValidator = ... Address address = ... // Validate all properties Set<InvalidConstraint<Address>> invalidItems = validator.validate(address); // Validate specific property Set<InvalidConstraint<Address>> invalidItems = validator.validateProperty(address, “city”); // Validate potential value for a property Set<InvalidContraint<Address>> invalidItems = validator.validateValue(“city”, “St. Louis”);
  56. 56. JMX 2.0 • JSR 255: http://jcp.org/en/jsr/detail?id=255 • JSR 262: http://jcp.org/en/jsr/detail?id=262 • Project: https://ws-jmx-connector.dev.java.net
  57. 57. Features • JMX 2.0 (JSR 255) • Retrofit with generics • Use annotations • Make Open MBeans easier to use • Generalize monitors to support non-simple types • Cascaded/federated MBean servers • Web services connector (JSR 262)
  58. 58. Language Changes • Project Coin
  59. 59. Strings in switch static boolean isStooge(String stooge) { switch(input) { case “Moe”: case “Curly”: case “Larry”: case “Shemp”: return true; default: return false; } }
  60. 60. Enum Comparisons enum Rank { LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL }
  61. 61. Enum Comparisons enum Rank { LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL } // Compare using either compareTo() or ordinals if(rank1.compareTo(rank2) < 0) ... if(rank1.ordinal() < rank2.ordinal()) ...
  62. 62. Enum Comparisons enum Rank { LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL } // Compare using either compareTo() or ordinals if(rank1.compareTo(rank2) < 0) ... if(rank1.ordinal() < rank2.ordinal()) ... // With enum comparison support can instead do: if(rank1 < rank2) ...
  63. 63. Chained Invocation // Construction with setters DrinkBuilder margarita = new DrinkBuilder(); margarita.add(“tequila”); margarita.add(“orange liqueur”); margarita.add(“lime juice”); margarita.withRocks(); margarita.withSalt(); Drink drink = margarita.drink();
  64. 64. Chained Invocation // Construction with setters DrinkBuilder margarita = new DrinkBuilder(); margarita.add(“tequila”); margarita.add(“orange liqueur”); margarita.add(“lime juice”); margarita.withRocks(); margarita.withSalt(); Drink drink = margarita.drink(); // Construction with chained invocation Drink margarita = new DrinkBuilder() .add(“tequila”) .add(“orange liqueur”) .add(“lime juice”) .withRocks() .withSalt() .drink();
  65. 65. Extension Methods // I wish List had a sort() method... List list = new ArrayList(); ... Collections.sort(list); // works for now list.sort(); // ERROR but cleaner
  66. 66. Extension Methods // I wish List had a sort() method... List list = new ArrayList(); ... Collections.sort(list); // works for now list.sort(); // ERROR but cleaner // Maybe we can add it later! import static java.util.Collections.sort; List list = new ArrayList(); ... list.sort(); // now this works! // equivalent to Collections.sort(list);
  67. 67. Exception boilerplate // too much boilerplate!!! } catch(RedException e) { LOGGER.info(e.getMessage(), e); throw e; } catch(BlueException e) { LOGGER.info(e.getMessage(), e); throw e; }
  68. 68. Exception boilerplate // too much boilerplate!!! } catch(RedException e) { LOGGER.info(e.getMessage(), e); throw e; } catch(BlueException e) { LOGGER.info(e.getMessage(), e); throw e; } // Catch common superclass??? } catch(Exception e) { LOGGER.info(e.getMessage(), e); throw e; }
  69. 69. Multi-catch public void foo() throws RedException, BlueException { try { ... // Use , to catch multiple types } catch(RedException, BlueException e) { LOGGER.info(e.getMessage(), e); throw e; } }
  70. 70. Safe Rethrown public void foo() throws RedException, BlueException { try { ... } catch(final Throwable e) { LOGGER.info(e.getMessage(), e); throw e; } }
  71. 71. Null Handling Car car = ... Integer tilt = null; if(car != null) { Sunroof sunroof = car.getSunroof()(; if(sunroof != null) { tilt = sunroof.getTilt(); } } Integer tilt = car?.getSunroof()?.getTilt();
  72. 72. Type Inference Map<String, Integer> map = new HashMap<String, Integer>(); Map<String, Integer> map = new HashMap<>();
  73. 73. JVM • Dynamic language support (JSR 292) • Method handles • Interface injection? • Tail recursion? • G1 garbage collector
  74. 74. Favorites? What was your favorite library change? What was your favorite language change? What’s missing?
  75. 75. Learn more... • http://tech.puredanger.com/java7 • http://java7.tumblr.com
  76. 76. Find Me... • http://tech.puredanger.com • Twitter: @puredanger

×