Spring with Immutability

87
© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission. Spring with Immutability Matt Stine Community Engineer, Cloud Foundry [email protected] http://mattstine.com Twitter: @mstine

description

Speaker: Readers of Josh Bloch's "Effective Java" are sometimes perplexed when they reach Item #15: "Minimize Mutability." If we are to minimize mutability, then obviously we must maximize immutability. While all Java programmers utilize immutable objects every day (e.g. java.lang.String), when asked to create our own immutable classes, we often hesitate. However, if we push through this hesitation, we'll reap the benefits of simpler reasoning about program correctness, free thread safety, and other benefits. One of the primary issues faced by enterprise Java programmers seeking to utilize immutable classes are framework issues. Enterprise frameworks from Spring to Hibernate have varying levels of support for immutability, ranging from decent to nonexistent. However, there several practical solutions available to the Spring developer, and this session will illuminate what's available.

Transcript of Spring with Immutability

Page 1: Spring with Immutability

© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Spring with ImmutabilityMatt Stine

Community Engineer, Cloud [email protected]

http://mattstine.comTwitter: @mstine

Page 2: Spring with Immutability

RELOADED

Page 3: Spring with Immutability

Item #15Minimize mutability

Page 4: Spring with Immutability

Recipe

• Don’t provide mutators

• Ensure the class can’t be extended

• Make all fields final

• Make all fields private

• Ensure exclusive access to any mutable components

Page 5: Spring with Immutability
Page 6: Spring with Immutability

Simple!

Page 7: Spring with Immutability

Inherently thread-safe!

Page 8: Spring with Immutability

Can be shared freely.

Page 9: Spring with Immutability
Page 10: Spring with Immutability

Can share internals.

Page 11: Spring with Immutability

BigInteger

signum mag

int[] = 100101

BigInteger

signum mag

BigInteger

signum mag

BigInteger

signummagBigInteger

signummag

BigInteger

signummag

Calling negate()

Page 12: Spring with Immutability

Make great building blocks for other objects.

Page 13: Spring with Immutability

Require separate object for each distinct value.

Page 14: Spring with Immutability

Assume immutability during design.

Page 15: Spring with Immutability

If mutability necessary, limit as much as possible.

Page 16: Spring with Immutability

Make every field final unless there is a compelling reason to

do otherwise.

Page 17: Spring with Immutability

Thinking in Immutability

Page 18: Spring with Immutability

Forces New Style

Page 19: Spring with Immutability

Procedure

Arguments

Possible Return Val

Side Effects

Procedural Out

Page 20: Spring with Immutability

Function

Arguments

Return Value

Functional In

Page 21: Spring with Immutability

Immutability is key to functional programming because it matches the goals of minimizing the parts that change, making it easier to

reason about those parts.

Neal Fordhttp://www.ibm.com/developerworks/library/j-ft4/

Page 22: Spring with Immutability

Ease into Programming with Immutability

Page 23: Spring with Immutability

Ease into Functional Programming

Page 24: Spring with Immutability

?Big Questions

Page 25: Spring with Immutability

Big Questions

• Performance Concerns

• Construction of Large Objects

• Framework Concerns

Page 26: Spring with Immutability

Performance Concerns

Page 27: Spring with Immutability

BigInteger

signum mag

int[] = 100101

BigInteger

signum mag

BigInteger

signum mag

BigInteger

signummagBigInteger

signummag

BigInteger

signummag

Revisiting negate()

Page 28: Spring with Immutability

What about large collections of objects?

Page 29: Spring with Immutability

Persistent Data Structures

Page 30: Spring with Immutability

Persistent List

From Programming Concurrency on the JVM, Venkat Subramaniam

Page 31: Spring with Immutability

Persistent Hash Trie

From Programming Concurrency on the JVM, Venkat Subramaniam

Page 32: Spring with Immutability

Persistent Hash Trie

From Programming Concurrency on the JVM, Venkat Subramaniam

Page 33: Spring with Immutability

Library Support

• TotallyLazyhttp://code.google.com/p/totallylazy/

• Functional Javahttp://functionaljava.org/

• CLJ-DS (Clojure’s data structures modified for use outside of Clojure)https://github.com/krukow/clj-ds

Page 34: Spring with Immutability

Code Examples = Spockhttp://spockframework.org

Page 35: Spring with Immutability
Page 36: Spring with Immutability
Page 37: Spring with Immutability
Page 38: Spring with Immutability
Page 39: Spring with Immutability

Construction of Large Objects

Page 40: Spring with Immutability

Telescoping Constructor Pattern

Page 41: Spring with Immutability
Page 42: Spring with Immutability

Doesn’t scale!

Page 43: Spring with Immutability

JavaBean PatternFAIL

Page 44: Spring with Immutability

http://en.wikipedia.org/wiki/File:Builder_UML_class_diagram.svg

The Builder Pattern

Page 45: Spring with Immutability

Builder Pattern

• Static member class of class it builds

• Simulates named optional parameters

• Can provide validation

Page 46: Spring with Immutability
Page 47: Spring with Immutability
Page 48: Spring with Immutability
Page 49: Spring with Immutability

Bob the Builderhttp://code.google.com/a/eclipselabs.org/p/bob-the-builder/

1. Download Jar

2. Add to dropins folder

Works with Helios, Indigo,and MyEclipse 10

Page 50: Spring with Immutability
Page 51: Spring with Immutability
Page 52: Spring with Immutability
Page 53: Spring with Immutability
Page 54: Spring with Immutability
Page 55: Spring with Immutability
Page 56: Spring with Immutability
Page 57: Spring with Immutability
Page 58: Spring with Immutability
Page 59: Spring with Immutability
Page 60: Spring with Immutability
Page 61: Spring with Immutability
Page 62: Spring with Immutability

Framework Concerns

Page 63: Spring with Immutability
Page 64: Spring with Immutability

Anything that...

• Requires a no-arg constructor

• Requires setter methods

Page 65: Spring with Immutability

Bridge Pattern

Morrison Bridge, Portland, OR

Page 66: Spring with Immutability

Marick’s Restructuring Layer

Page 67: Spring with Immutability

Nugget

Nugget

ImmutableNugget

Mutable World

Mutable World

Restructuring

Restructuring

Page 68: Spring with Immutability

Dozerhttp://dozer.sourceforge.net/https://github.com/DozerMapper/dozer

Page 69: Spring with Immutability

JavaBean PatternFAIL

Page 70: Spring with Immutability

Use the Builder!http://codeslut.blogspot.com/2010/05/mapping-immutable-value-objects-with.html

Page 71: Spring with Immutability
Page 72: Spring with Immutability
Page 73: Spring with Immutability
Page 74: Spring with Immutability
Page 75: Spring with Immutability
Page 76: Spring with Immutability

Frameworks Supporting Immutability

Page 77: Spring with Immutability

JIRM

Java Immutable object Relational Mapperhttps://github.com/agentgt/jirm

Page 78: Spring with Immutability

Leverages Spring JDBC

Page 79: Spring with Immutability
Page 80: Spring with Immutability
Page 81: Spring with Immutability
Page 82: Spring with Immutability
Page 83: Spring with Immutability
Page 84: Spring with Immutability
Page 85: Spring with Immutability

Code Samples

https://github.com/mstine/immutability-examples

Page 86: Spring with Immutability

Matt StineCommunity Engineer, Cloud Foundry

[email protected]://mattstine.com

Twitter: @mstinePlease fill out an evaluation!

Spring with

Immutability

Page 87: Spring with Immutability

Image Credits

• “Think,” sculpture by Nathan Sawaya, photo by Matt Stine

• “Blue Sky,” sculpture by Nathan Sawaya, photo by Matt Stine

• “Title Unknown,” sculpture by Nathan Sawaya, photo by Matt Stine

• “Yellow,” sculpture by Nathan Sawaya, photo by Matt Stine

• “Morrison Bridge, Portland, OR,” photo by Matt Stine

• “CAT Dozer,” http://www.flickr.com/photos/mkw87/4877121037