java 7 preview
DESCRIPTION
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.TRANSCRIPT
![Page 1: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/1.jpg)
Java SE 7 PreviewAlex Miller
Blog: http://tech.puredanger.comTwitter: http://twitter.com/puredanger
![Page 2: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/2.jpg)
History
2010
Feb, 2002
J2SE 1.4
Sept, 2004
J2SE 5.0
Dec, 2006
Java SE 6
Nov, 2008
Java SE 6
Update 10
??
Java SE 7
2002 2003 2004 2005 2006 2007 2008
assert
regular expressions
IPv6
NIO
Logging API
Image I/O API
XML/XSLT
Security/crypto
Java Web Start
generics
annotations
autoboxing
enumerations
synth LAF
enhanced for loop
varargs
Java Memory Model
concurrent library
static imports
scripting support
JAX-WS
Java compiler API
pluggable annotations
SwingWorker, etc
Java Kernel
Java Quick Starter
Nimbus LAF
Java Plugin NG
2009
![Page 3: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/3.jpg)
Full MenuModularity• Project Jigsaw• JSR 294 Superpackages
Libraries• JSR 203 NIO2• JSR 275 Units and Quantities• JSR 310 Date and Time API• JSR 166 Concurrency Utilities• JSR 225 XQuery API for Java• JSR 284 Resource Consumption Mgmt
Swing • JSR 296 Swing Application Framework• JSR 295 Beans Binding• JSR 303 Beans Validation• Java Media Components
JMX• JSR 255 JMX 2.0• JSR 262 Web Services Connector
Tools• JSR 326 Post-mortem JVM Diagnostics API• JSR 260 Javadoc Update
Types and Generics• Reified Generics• Type Literals• JSR 308 Annotations on Java Types• Type Inference
Language Proposals• Closures• Automatic Resource Mgmt Blocks• Language level XML support• JavaBean property support• BigDecimal operator support• Strings in switch statements• Comparisons for Enums• Chained invocation• Extension methods• Improved catch• Null handling improvements
JVM• invokedynamic• Tiered compilation• G1 garbage collector
![Page 4: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/4.jpg)
Who Decides?
Danny Coward
...and of course the Java SE 7 JSR Expert Group
![Page 5: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/5.jpg)
Status du jourModularity• Project Jigsaw YES• JSR 294 Superpackages YES
Libraries• JSR 203 NIO2 YES• JSR 275 Units and Quantities NO?• JSR 310 Date and Time API HMM• JSR 166 Concurrency Utilities YES• JSR 225 XQuery API for Java YES?• JSR 284 Resource Consumption Mgmt NO
Swing • JSR 296 Swing Application Framework YES• JSR 295 Beans Binding NO• JSR 303 Beans Validation HMM• Java Media Components YES?
JMX• JSR 255 JMX 2.0 YES• JSR 262 Web Services Connector YES
Tools• JSR 326 Post-mortem JVM Diagnostics HMM• JSR 260 Javadoc Update NO
Types and Generics• Reified Generics NO• Type Literals NO• JSR 308 Annotations on Java Types YES• Type Inference YES?
Language Proposals• Closures NO• Automatic Resource Mgmt Blocks NO• Language level XML support NO• JavaBean property support NO• BigDecimal operator support NO• Strings in switch statements HMM• Comparisons for Enums HMM• Chained invocation HMM• Extension methods HMM• Improved catch YES?• Null handling improvements YES?
JVM• invokedynamic YES• Tiered compilation HMM• G1 garbage collector YES• Compressed pointer 64 bit VM YES
![Page 6: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/6.jpg)
FocusModularity• Project Jigsaw• JSR 294 Superpackages
Libraries• JSR 203 NIO2• JSR 310 Date and Time API• JSR 166 Concurrency Utilities
Swing • JSR 296 Swing Application
Framework• JSR 303 Beans Validation
JMX• JSR 255 JMX 2.0• JSR 262 Web Services
Connector
Language Proposals• Strings in switch• Comparisons for Enums• Chained invocation• Extension methods• Improved catch• Null handling• Type Inference
JVM• invokedynamic
![Page 7: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/7.jpg)
Java Modularity
• JSR 294: http://jcp.org/en/jsr/detail?id=294
• Project: http://openjdk.java.net/projects/modules
![Page 8: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/8.jpg)
JAR Hell
![Page 9: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/9.jpg)
Jar Hell in Action
Dependency management is one of the most important (and challenging) features of modern software development
![Page 10: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/10.jpg)
Module Development
// org/foo/api/FooFighters.java:
module org.foo;package org.foo.api;
public class FooFighters { public static FooFighters newBand() { return new org.foo.impl.FooFightersImpl(); }}
org.foo.api
org.foo.util
org.foo.impl
org.foo.domain
org.foo
![Page 11: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/11.jpg)
Module Development
// org/foo/impl/FooFightersImpl.java:
module org.foo;package org.foo.impl;
module class FooFightersImpl implements FooFighters {
// etc}
org.foo.api
org.foo.util
org.foo.impl
org.foo.domain
org.foo
![Page 12: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/12.jpg)
Module Development// org/foo/module-info.java:
@Version(“2.3”)@MainClass(“org.foo.Foosball”)@ImportModules {@ImportModule(name=”java.se.core”,
version=”1.7+”) @ImportModule(name=”org.bar”, version=”1.0”, reexport=”true”)}@ExportResources({“org/foo/icons/**})module org.foo;
org.foo.api
org.foo.util
org.foo.impl
org.foo.domain
org.foo
![Page 13: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/13.jpg)
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/*
![Page 14: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/14.jpg)
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
![Page 15: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/15.jpg)
Module Resolution
Module A(1.0)
Module C(4.1)
Module C(3.2)
Module B(2.0)
Bootstrap
Extension
Global
OSGi
Bootclasspath
ESOM
Classpath
Maven URL
![Page 16: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/16.jpg)
Project Jigsaw
• Modularize the JDK itself
• Integrate at low level
• Integrate with native packaging
• NOT a JSR but part of JDK 7
![Page 17: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/17.jpg)
NIO 2
• JSR 203: http://jcp.org/en/jsr/detail?id=203
• Project: http://openjdk.java.net/projects/nio
![Page 18: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/18.jpg)
NIO 2 Themes
• New file system API
• Asynchronous I/O on sockets and files
• Completion of socket channel work
![Page 19: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/19.jpg)
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
![Page 20: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/20.jpg)
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
![Page 21: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/21.jpg)
File System API
FileRef
PathFileSystem
FileStore
FileSystems
Files
Paths
DirectoryStream
DirectoryStreamFilters
DirectoryStream.Filter
FileVisitor
FileVisitResult
WatchService
WatchKey WatchEvent
Watchable
FileAttributeView
BasicFileAttributeView
NamedAttributeView
AttributeView
![Page 22: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/22.jpg)
Using Pathimport java.nio.file.*;
// FileSystems -> FileSystem -> PathFileSystem fileSystem = FileSystems.getDefault();Path homeDir = fileSystem.getPath(“/Users/amiller”);
// Shortcut with Paths helper classPath homeDir = Paths.get(“/Users/amiller”);
// Resolve one path in terms of anotherPath relativeTemp = Paths.get(“temp”);Path absoluteTemp = relativeTemp.resolve(homeDir);
// Get relative path from a basePath absoluteProfile = Paths.get(“/Users/amiller/.profile”);Path relativeProfile = absoluteProfile.relativize(homeDir);assert relativeProfile.isRelative();assert relativeProfile.getNameCount() == 1;
![Page 23: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/23.jpg)
Appending to a file
import java.io.*;import java.nio.file.*;import static java.nio.file.StandardOpenOption.*;
Path journal = Paths.get("/Users/amiller/journal.txt");
OutputStream stream = journal.newOutputStream(CREATE, APPEND);
try { writeEntry(stream); // normal stuff} finally { stream.close();}
![Page 24: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/24.jpg)
Copying and Moving
import java.nio.file.*;
Path home = Paths.get("/Users/amiller");Path secrets = home.resolve("secrets.txt"); // Steal secretssecrets.copyTo(home.resolve("stolenSecrets.txt"));
// Hide secretssecrets.moveTo(Paths.get("/Users/dvader/secrets.txt"));
![Page 25: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/25.jpg)
Walking DirectoriesPath music = Paths.get("/Users/amiller/files/music");
// External iteratorDirectoryStream<Path> mp3s =
music.newDirectoryStream(“*.mp3”);
try { for(Path entry : mp3s) System.out.println(entry.getName());} finally { mp3s.close();}
// Internal iteratorFiles.withDirectory(music, “*.mp3”, new FileAction<Path>() {public void invoke(Path entry) {System.out.println(entry.getName());
}});
![Page 26: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/26.jpg)
Recursive WalkPath itunes = Paths.get("/Users/amiller/Music/iTunes/iTunes Music");
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));
![Page 27: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/27.jpg)
File Attributes
Path file = Paths.get(“/usr/bin/perl”);
// true here means follow symbolic linksBasicFileAttributes attrs = Attributes.readPosixFileAttributes(file, true);
Set<PosixFilePermission> perms = attrs.permissions();
System.out.format("%s %s %s", PosixFilePermission.toString(perms),attrs.owner(), attrs.group());
// rwxr-xr-x root wheel
![Page 28: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/28.jpg)
Watchersimport 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 pollfor(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
}
![Page 29: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/29.jpg)
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
![Page 30: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/30.jpg)
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
![Page 31: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/31.jpg)
A simple exampleDate xmasEve = new Date(2008, 12, 25, 23, 59, 59);
Is this right?
![Page 32: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/32.jpg)
A simple exampleDate 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);
![Page 33: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/33.jpg)
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
![Page 34: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/34.jpg)
Continuous
![Page 35: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/35.jpg)
// Create some instants in secondsInstant start2008 = Instant.instant(1199167200);Instant start2009 = Instant.instant(1230789600);assert start2008.isBefore(start2009);
// Create an interval - [inclusive, exclusive] by defaultInstantInterval year2008 =InstantInterval.intervalBetween(start2008, start2009);
assert year2008.contains(start2008);assert ! year2008.contains(start2009);
// Create a duration in secondsDuration minute = Duration.duration(60);Duration hour = minute.multipliedBy(60);Duration duration2008 = Duration.durationBetween(start2008, start2009);
Instants, Intervals, and Durations
![Page 36: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/36.jpg)
Human
+
![Page 37: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/37.jpg)
// 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 UTCOffsetDateTime start2008Offset = OffsetDateTime.dateTime(start2008, ZoneOffset.zoneOffset(-6));
// Tie to current local time zoneZonedDateTime start2008Zoned = ZonedDateTime.dateTime(start2008, Clock.system().timeZone());
Local*, Offset*, Zoned*
![Page 38: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/38.jpg)
Clock// Use pre-defined system clock usuallyClock clock = Clock.system();
// Create instantInstant now = clock.instant();
// Create human date / timeLocalDate today = clock.today();
![Page 39: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/39.jpg)
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 transitionClock clock = new my.test.ControlTimeClock(y2kInstant);
![Page 40: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/40.jpg)
Other cool stuff
• Matchers, Adjusters, Resolvers
• Full time zone rule support
• Periods: “8 years, 2 months”
• Formatting and parsing
![Page 41: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/41.jpg)
Integration
• Date, Calendar, etc - retrofit with interfaces
• JDBC - map to SQL types
• XML Schema - based on same standard so should be straightforward
![Page 42: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/42.jpg)
Fork / join
• JSR 166y: http://jcp.org/en/jsr/detail?id=166
• Project: http://gee.cs.oswego.edu/dl/concurrency-interest/index.html
![Page 43: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/43.jpg)
Divide and Conquer
Task: Find max value in an array
![Page 44: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/44.jpg)
Divide and Conquer
![Page 45: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/45.jpg)
Divide and Conquer
![Page 46: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/46.jpg)
Divide and Conquer
![Page 47: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/47.jpg)
ParallelArray
import static Ops.*;
ForkJoinPool fj = new ForkJoinPool(10);Order[] data = ...ParallelArray<Order> orders = new ParallelArray(fj, data);
![Page 48: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/48.jpg)
ParallelArrayimport static Ops.*;
// FilterOps.Predicate<Order> isLate = new Ops.Predicate<Order>() { public boolean op(Order o) {return o.due() < new Date();
}};
// MapOps.Predicate<Order> daysOverdue = new Ops.ObjectToInt<Order>() {public int op(Order o) { return daysOverdue(o.due());
}};
![Page 49: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/49.jpg)
ParallelArray
SummaryStatistics<Integer> summary = orders.withFilter(isLate) .withMapping(daysOverdue) .summary();
System.out.println(“overdue: “ + summary.size());System.out.println(“avg by: “ + summary.average());
![Page 50: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/50.jpg)
Swing App Framework
• JSR 296: http://jcp.org/en/jsr/detail?id=296
• Project: https://appframework.dev.java.net/
![Page 51: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/51.jpg)
Swing Application Framework
initialize(String[])startup()shutdown()exit()
Application
SingleFrameApplication
ApplicationContext
TaskMonitor
LocalStorage
SessionStorage
ResourceManager
ActionManager
TaskService
Task
SwingWorker
ResourceMap
ResourceConverter
ApplicationActionMap
@Action
![Page 52: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/52.jpg)
Beans Validation
• JSR 303: http://jcp.org/en/jsr/detail?id=303
![Page 53: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/53.jpg)
Constraints and Validators
• JavaBeans property validation
• Meta-annotation for defining constraint annotations
• Core Constraint classes
![Page 54: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/54.jpg)
@ZipCodeCityCoherenceChecker // works on Address itselfpublic 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}
Constraints
![Page 55: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/55.jpg)
ValidationValidator<Address> addressValidator = ...Address address = ...
// Validate all propertiesSet<InvalidConstraint<Address>> invalidItems = validator.validate(address);
// Validate specific propertySet<InvalidConstraint<Address>> invalidItems = validator.validateProperty(address, “city”);
// Validate potential value for a propertySet<InvalidContraint<Address>> invalidItems = validator.validateValue(“city”, “St. Louis”);
![Page 56: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/56.jpg)
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
![Page 57: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/57.jpg)
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)
![Page 58: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/58.jpg)
Language Changes
• Project Coin
![Page 59: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/59.jpg)
Strings in switch
static boolean isStooge(String stooge) {switch(input) {case “Moe”:case “Curly”:case “Larry”:case “Shemp”:return true;
default: return false;
}}
![Page 60: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/60.jpg)
Enum Comparisonsenum Rank {LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL
}
![Page 61: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/61.jpg)
Enum Comparisonsenum Rank {LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL
}
// Compare using either compareTo() or ordinalsif(rank1.compareTo(rank2) < 0) ...if(rank1.ordinal() < rank2.ordinal()) ...
![Page 62: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/62.jpg)
Enum Comparisonsenum Rank {LIEUTENANT, CAPTAIN, MAJOR, COLONEL, GENERAL
}
// With enum comparison support can instead do:if(rank1 < rank2) ...
// Compare using either compareTo() or ordinalsif(rank1.compareTo(rank2) < 0) ...if(rank1.ordinal() < rank2.ordinal()) ...
![Page 63: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/63.jpg)
Chained Invocation// Construction with settersDrinkBuilder margarita = new DrinkBuilder();margarita.add(“tequila”);margarita.add(“orange liqueur”);margarita.add(“lime juice”);margarita.withRocks();margarita.withSalt();Drink drink = margarita.drink();
![Page 64: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/64.jpg)
Chained Invocation// Construction with settersDrinkBuilder 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 invocationDrink margarita = new DrinkBuilder().add(“tequila”).add(“orange liqueur”).add(“lime juice”).withRocks().withSalt().drink();
![Page 65: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/65.jpg)
Extension Methods// I wish List had a sort() method...List list = new ArrayList();...Collections.sort(list); // works for nowlist.sort(); // ERROR but cleaner
![Page 66: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/66.jpg)
Extension Methods// I wish List had a sort() method...List list = new ArrayList();...Collections.sort(list); // works for nowlist.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);
![Page 67: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/67.jpg)
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;
}
![Page 68: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/68.jpg)
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;
}
![Page 69: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/69.jpg)
Multi-catchpublic void foo() throws RedException, BlueException {
try { ...
// Use , to catch multiple types } catch(RedException, BlueException e) { LOGGER.info(e.getMessage(), e); throw e; }}
![Page 70: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/70.jpg)
Safe Rethrown
public void foo() throws RedException, BlueException {
try { ...
} catch(final Throwable e) { LOGGER.info(e.getMessage(), e); throw e; }}
![Page 71: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/71.jpg)
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();
![Page 72: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/72.jpg)
Type Inference
Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map = new HashMap<>();
![Page 73: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/73.jpg)
JVM
• Dynamic language support (JSR 292)
• Method handles
• Interface injection?
• Tail recursion?
• G1 garbage collector
![Page 74: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/74.jpg)
Favorites?
What was your favorite library change?
What was your favorite language change?
What’s missing?
![Page 75: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/75.jpg)
Learn more...
• http://tech.puredanger.com/java7
• http://java7.tumblr.com
![Page 76: Java 7 Preview](https://reader034.vdocuments.net/reader034/viewer/2022042521/554f833bb4c905435d8b4ac6/html5/thumbnails/76.jpg)
Find Me...
• http://tech.puredanger.com
• Twitter: @puredanger