The Well-Grounded Java Developer

      Introduction to Java 7
This is not an Oracle legal slide




                              2
No, we’re not in sales!
• Get in touch
   - Ben is: @kittylist
   - Martijn is: @karianna (and @diabolicaldev)


• What we do
   - Authors of “The Well-Grounded Java Developer”
   - CEO/CTO of jClarity - JVM/Hardware/Performance stuff


• We co-lead the LJC (London’s Java User Group)
   - Hold a seat on the JCP SE/EE Executive Committee
   - Run Adopt a JSR and Adopt OpenJDK programmes
Or in pictures...
How this session is going to work
 • This session may be a little different to advertised...
    - Being a “Well-Grounded Java Developer” changes over time


 • This session will go fairly quickly
    - But the slides will be made available
    - And you can always get hold of us for any questions


 • There are USB keys going around
    - Copy over the WGJD into $WORKSPACE
    - Install Java 7 if you haven't done so already!
    - Your major IDEs should work


 • Pair/Group programming works best
    - Have the least experienced person do the actual typing!
Attempted Timetable
Introduction to Java 7 - 0900-0955 (~55 mins)
      – BREAK (5 minutes)



Polyglot and functional programming - 1000-1030 (~30 mins)



BREAK (30 minutes)



Polyglot and functional programming - 1100-1125 (~25 mins)
      – BREAK (5 minutes)



Modern Java Concurrency - 1130-1230(~60 mins)
Real developers code through
       bathroom breaks




                          7
The Well-Grounded Java Developer...
   • Is not just a Java language whizz
      -   Understands the basics of the JVM
      -   Understands software development is a social activity
      -   Utilises software craftsmanship approaches
      -   Understands physical and logical architectures


   • Is using Java 7
      - At least at home if not at work


   • Is looking at polyglot and functional programming


   • Is looking at modern concurrency practices
Java 7 - Why is it important
• The WGJD wants to code rapidly


• The WGJD wants to code concisely


• The WGJD wants to take advantage of:
   - The compiler (including JIT)
   - The JVM (including GC)


• Java 7 gives you many improvements in these areas
OpenJDK - The Java 7/8 split
• 20 Sep 2010 - Mark Reinhold announces Plan B
   - Splits OpenJDK plan into Java 7 (July 2011) & Java 8 (2013)
   - Popular choice with the community


• July 2011 - Java 7 goes gold
   - Wow, a whole year ago now!


• Some new features to be delayed until JDK 8
   - Lambda Expressions
   - Modularisation (aka Jigsaw)


• JRockit features to be merged into OpenJDK
   - Enhanced management of the JVM
   - Ongoing merge of the VM engineering groups
Contents of JDK 7 Release
Project Coin



NIO.2



Method Handles



invokedynamic



Concurrency Refresh



Odds & Ends
Project Coin
• “Small” changes


• Language Level, not VM


• Stay away from the type system


• Developed in a very OSS manner
   - Was an ‘interesting’ experience for all involved
Project Coin - Highlights
Strings in switch


try-with-resources (aka ARM or TWR)


Diamond Syntax


Multi-catch with precise re-throw


Enhanced syntax for numeric literals


Varargs / autoboxing warning
Strings in switch




• Code along exercise: FeedingSchedule.java
try-with-resources
Diamond syntax




• Code along exercise: HordeOfOtters.java
Personally I’d stick to Java 1.4




                             17
NIO.2 - New I/O version 2
• A new file system and path abstraction


• Based on Path
   - An abstract view of a ‘file like’ system


• Files class contains many helper methods, including
   - File manipulation (copy, move, rename etc)
   - Walking directory trees
   - Native file system support (e.g. symbolic links)


• Works with existing java.io.File code
NIO.2 - New I/O version 2
• Asynchronous (non-blocking) I/O


• For sockets and files


• Mainly utilises java.util.concurrent.Future


• New NetworkChannel
   - Socket/Channel construct
   - Binding, options and multicast
Path and Files - Some examples




• Code along exercise: Housekeeping.java
URL stream to file - Java 6 style NIO
URL stream to file in Java 7




• Code along exercise: VetNotes.java
NIO.2 - Future base file I/O




• See ExceptionExamples.java as well (multi-catch)
Method Handles
• We already have Reflection API
   - It’s all pretty horrible


• JDK 7 introduces a new way to inspect at runtime


• Method Handles
   -   Represent the ability to call a method
   -   Implement subclass java.lang.invoke.MethodHandle
   -   Are strongly-typed and typesafe
   -   Needed for invokedynamic - but also used standalone
Example - ThreadPoolManager
Cancelling using Reflection
Cancelling using MethodHandle
invokedynamic

• invokedynamic is a key new JVM feature
   - It’s the first new bytecode since Java 1.0
   - Joins invokevirtual, invokestatic,
     invokeinterface and invokespecial


• Relaxes a key part of the static typing system
   - User code can determine dispatch at runtime


• Aims to be as fast as regular method dispatch
   - e.g. invokevirtual


• No Java syntax in Java 7
   - But maybe for Java 8
invokedynamic contd.
• JRuby, Jython, Groovy, Clojure et al all benefit
   - JRuby gains a lot, Clojure not so much
   - Even Scala is using it now!


• JRuby works closely with the JSR-292 team
   - Charlie Nutter (winner of JAX special jury award)
   - Big wins
   - Makes JRuby enticing to Ruby developers


• Java 8 also gets a boost
   - Lambdas will be implemented with invokedynamic
Other JVM Languages?
Meh - Use the Golden Hammer!




                          30
Java 7 Concurrency Refresh
• Java 7 has a number of new concurrency toys


• The headline item is Fork / Join
    - Similar to Map/Reduce, useful for a certain class of problems
    - Fork and join executions are not necessarily threads


• We’ll cover this in the final hour!
Java 7 - That’s not all
• Nimbus Look & Feel for Swing


• New helper classes including Objects
   - deepEquals() and friends


• JDBC with try-with-resources support


• Better unicode support
   - Thanks in part to Tom Christiansen of Perl fame


• More small changes in niche areas
New Faces in the OpenJDK
What We Didn’t Have Time To Talk About
    • Java 8
       - Java FX 2.x


    • Java EE 6/7


    • Java ME


    • JDK Enhancement Proposals (JEPs)


    • Java Community Process (JCP)
       - Java Specification Requests (JSRs)
       - Java User Groups (JUGs) and 'Adopt' programs
What? You still here?
Go take a break will you!




                            35

Introduction to Java 7 (OSCON 2012)

  • 1.
    The Well-Grounded JavaDeveloper Introduction to Java 7
  • 2.
    This is notan Oracle legal slide 2
  • 3.
    No, we’re notin sales! • Get in touch - Ben is: @kittylist - Martijn is: @karianna (and @diabolicaldev) • What we do - Authors of “The Well-Grounded Java Developer” - CEO/CTO of jClarity - JVM/Hardware/Performance stuff • We co-lead the LJC (London’s Java User Group) - Hold a seat on the JCP SE/EE Executive Committee - Run Adopt a JSR and Adopt OpenJDK programmes
  • 4.
  • 5.
    How this sessionis going to work • This session may be a little different to advertised... - Being a “Well-Grounded Java Developer” changes over time • This session will go fairly quickly - But the slides will be made available - And you can always get hold of us for any questions • There are USB keys going around - Copy over the WGJD into $WORKSPACE - Install Java 7 if you haven't done so already! - Your major IDEs should work • Pair/Group programming works best - Have the least experienced person do the actual typing!
  • 6.
    Attempted Timetable Introduction toJava 7 - 0900-0955 (~55 mins) – BREAK (5 minutes) Polyglot and functional programming - 1000-1030 (~30 mins) BREAK (30 minutes) Polyglot and functional programming - 1100-1125 (~25 mins) – BREAK (5 minutes) Modern Java Concurrency - 1130-1230(~60 mins)
  • 7.
    Real developers codethrough bathroom breaks 7
  • 8.
    The Well-Grounded JavaDeveloper... • Is not just a Java language whizz - Understands the basics of the JVM - Understands software development is a social activity - Utilises software craftsmanship approaches - Understands physical and logical architectures • Is using Java 7 - At least at home if not at work • Is looking at polyglot and functional programming • Is looking at modern concurrency practices
  • 9.
    Java 7 -Why is it important • The WGJD wants to code rapidly • The WGJD wants to code concisely • The WGJD wants to take advantage of: - The compiler (including JIT) - The JVM (including GC) • Java 7 gives you many improvements in these areas
  • 10.
    OpenJDK - TheJava 7/8 split • 20 Sep 2010 - Mark Reinhold announces Plan B - Splits OpenJDK plan into Java 7 (July 2011) & Java 8 (2013) - Popular choice with the community • July 2011 - Java 7 goes gold - Wow, a whole year ago now! • Some new features to be delayed until JDK 8 - Lambda Expressions - Modularisation (aka Jigsaw) • JRockit features to be merged into OpenJDK - Enhanced management of the JVM - Ongoing merge of the VM engineering groups
  • 11.
    Contents of JDK7 Release Project Coin NIO.2 Method Handles invokedynamic Concurrency Refresh Odds & Ends
  • 12.
    Project Coin • “Small”changes • Language Level, not VM • Stay away from the type system • Developed in a very OSS manner - Was an ‘interesting’ experience for all involved
  • 13.
    Project Coin -Highlights Strings in switch try-with-resources (aka ARM or TWR) Diamond Syntax Multi-catch with precise re-throw Enhanced syntax for numeric literals Varargs / autoboxing warning
  • 14.
    Strings in switch •Code along exercise: FeedingSchedule.java
  • 15.
  • 16.
    Diamond syntax • Codealong exercise: HordeOfOtters.java
  • 17.
    Personally I’d stickto Java 1.4 17
  • 18.
    NIO.2 - NewI/O version 2 • A new file system and path abstraction • Based on Path - An abstract view of a ‘file like’ system • Files class contains many helper methods, including - File manipulation (copy, move, rename etc) - Walking directory trees - Native file system support (e.g. symbolic links) • Works with existing java.io.File code
  • 19.
    NIO.2 - NewI/O version 2 • Asynchronous (non-blocking) I/O • For sockets and files • Mainly utilises java.util.concurrent.Future • New NetworkChannel - Socket/Channel construct - Binding, options and multicast
  • 20.
    Path and Files- Some examples • Code along exercise: Housekeeping.java
  • 21.
    URL stream tofile - Java 6 style NIO
  • 22.
    URL stream tofile in Java 7 • Code along exercise: VetNotes.java
  • 23.
    NIO.2 - Futurebase file I/O • See ExceptionExamples.java as well (multi-catch)
  • 24.
    Method Handles • Wealready have Reflection API - It’s all pretty horrible • JDK 7 introduces a new way to inspect at runtime • Method Handles - Represent the ability to call a method - Implement subclass java.lang.invoke.MethodHandle - Are strongly-typed and typesafe - Needed for invokedynamic - but also used standalone
  • 25.
  • 26.
  • 27.
  • 28.
    invokedynamic • invokedynamic isa key new JVM feature - It’s the first new bytecode since Java 1.0 - Joins invokevirtual, invokestatic, invokeinterface and invokespecial • Relaxes a key part of the static typing system - User code can determine dispatch at runtime • Aims to be as fast as regular method dispatch - e.g. invokevirtual • No Java syntax in Java 7 - But maybe for Java 8
  • 29.
    invokedynamic contd. • JRuby,Jython, Groovy, Clojure et al all benefit - JRuby gains a lot, Clojure not so much - Even Scala is using it now! • JRuby works closely with the JSR-292 team - Charlie Nutter (winner of JAX special jury award) - Big wins - Makes JRuby enticing to Ruby developers • Java 8 also gets a boost - Lambdas will be implemented with invokedynamic
  • 30.
    Other JVM Languages? Meh- Use the Golden Hammer! 30
  • 31.
    Java 7 ConcurrencyRefresh • Java 7 has a number of new concurrency toys • The headline item is Fork / Join - Similar to Map/Reduce, useful for a certain class of problems - Fork and join executions are not necessarily threads • We’ll cover this in the final hour!
  • 32.
    Java 7 -That’s not all • Nimbus Look & Feel for Swing • New helper classes including Objects - deepEquals() and friends • JDBC with try-with-resources support • Better unicode support - Thanks in part to Tom Christiansen of Perl fame • More small changes in niche areas
  • 33.
    New Faces inthe OpenJDK
  • 34.
    What We Didn’tHave Time To Talk About • Java 8 - Java FX 2.x • Java EE 6/7 • Java ME • JDK Enhancement Proposals (JEPs) • Java Community Process (JCP) - Java Specification Requests (JSRs) - Java User Groups (JUGs) and 'Adopt' programs
  • 35.
    What? You stillhere? Go take a break will you! 35

Editor's Notes

  • #2 TODO: Overall if we have time, replace images of code with actual code\n
  • #3 First laugh of the day\n
  • #4 We're (Fairly) old (mostly FOSS) hackers and cause trouble at conferences\nBen is known for his performance & concurrency work\nMartijn is also known as the “Diabolical Developer”\n
  • #5 * Charities, financial services and beer.\n
  • #6 \n
  • #7 * No plan survives contact with the enemy, that would be you guys!\n
  • #8 In reference to timeline\n
  • #9 \n
  • #10 \n
  • #11 * Surprising fact, but the largest group of engineers ever were deployed on Java 7\nWe'll cover Java 8 in our talk later this week!\nClosures, Lambdas, SAM literals\n
  • #12 \n
  • #13 Most developers make f&^^%n terrible language designers\nWant to get involved? Talk to us about Adopt OpenJDK\n
  • #14 \n
  • #15 * Incidentally JSR 310 provides much better date and time handling, join our Adopt a JSR program to learn more!\n
  • #16 \n
  • #17 \n
  • #18 In reference to how awesome the coin features are\n
  • #19 \n
  • #20 \n
  • #21 \n
  • #22 \n
  • #23 * "So we had a bit of a fail with our domain hosting agency..."\n* TODO - We need to provide some text files hosted at a URL\n
  • #24 * Do the “who knows j.u.c”? question at the start\n* Spot the numeric literal! \n
  • #25 TODO: “I want my Coffee!” physical theatre\n
  • #26  See & use interfaces/classes/methods and fields at runtime.\n* Call methods without knowing their names at runtime\n* Think “Reflection done in a safe and modern way\n
  • #27 TODO: Do we have a simpler example? Perhaps we could extract the Runnable into a local var for readability?\nTODO: Was this the one with the code bug?\n
  • #28 * Spot the setAccessible() - we need to make the private method accessible\n
  • #29 Lookup happens in the context where it’s called from.\nMeans that if you lookup() from inside a class, you can see all the private methods.\nThen you can selectively hand out a reference for others to call them.\n* Method handle calls can be inlined through\n* Also unreflect\n
  • #30 * Method names / signatures will not need to be known at compile time\n* uses MethodHandle\n
  • #31 \n
  • #32 In reference to how awesome invokedynamic is\n
  • #33 \n
  • #34 * Talk to the pattern in the many Java libraries - Foo / AbstractFoo / Foos\n
  • #35 \n
  • #36 \n
  • #37 \n