That's a guiding light of #ProjectAmber and record serialization is the first step. The Inside Java Podcast episode on that topic with Julia Boes and @chegar999 (inside.java/2021/03/08/pod…) gives great insight into how it achieves that. 🧵
1/10
First, what's wrong with regular serialization? In short:
* extralinguistic mechanism (aka "magic")
* undermines encapsulation
* causes security issues
* hinders evolving code
* holds back new Java features
In long (and why it turned out that way), see attached thread.
"The magic is where the sin was" (@BrianGoetz) and so record serialization promises "what you see is what you get", making it:
1. easy to understand 2. no magic 3. more secure 4. more performant
3/10
This can be achieved because data is at the core of both serialization and records (as opposed to regular classes), so there's no impedence mismatch. (Observe how this naturally follows from making records a semantic entity, not just a boilerplate avoider.)
4/10
To serialize, an instance's state needs to be extracted. Easy with records because each component has an accessor.
To deserialize, an instance with the correct state needs to be created. Easy for records because the canonical constructor handles all components.
5/10
Interesting is the handling of serial version UIDs: Their default is 0 and records ignore them (they don't need to match). During deserialization, missing fields are injected with their default value. (Not sure what happens to data for absent fields - ignored, I presume.)
6/10
This covers "easy to understand" and "no magic". As to "more secure":
Invariants now only need to be verified in the constructor, not also during deserialization. And that no magic assigns fields after construction also means that `final` record fields can be truly final.
7/10
What about "more performant"? Compared to classes, records are constrained (final types and final fields) and no magic is required during (de)serialization. This makes the code simpler and faster.
8/10
From 21:48 on, Julia describes how method handles and dynamically computed constants are used to store the deserialization logic in the records class file. This allows for compiler optimizations and can be reused by other serialization frameworks.
9/10
How can you get this bliss into your code?
Be on #Java16, refactor classes to records (don't worry about stored serialized forms, they can be deserialized to classes *or* records), and use one of the frameworks that already support them (e.g. Jackson, Apache Johnzon).
10/10
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Do you dream of "value types" in Java? So do I! Hence I was thrilled to see that Project Valhalla is slowly coming out of exploration with two draft JEPs.
Here's what they currently propose. 🧵👇🏾
(If you prefer video: https:/www.youtube.com/watch?v=WBvTilbh8S0&t=344s)
1/10
First, why value types? To bridge the divide between
* primitives (fast, no memory overhead) and
* reference types (abstraction, safety, identity)
As is, we sometimes have to choose between performance and design. And we often choose wrongly.
"When people ask me what feature do I most regret, serialization is the easy answer" - @BrianGoetz
Let's talk about serialization in Java: Why does it exist? What are the problems (even today)? Would Java have been better off without it? Can it be fixed?
1/11
NB: What follows is mostly quotes or paraphrasing from a conversation I had with Brian during my 25-hour live stream. If you want to watch the full discussion about serialization, nullability, primitives, and more, you can find it here:
2/11
Serialization was introduced because turning an object graph into bytes is valuable: You can store things on disk, in databases, or send them over the wire. But while the concept is sound, it was implemented in a horrible way.
Project Amber is making progress on pattern matching in #JavaNext. Here are three recent developments that I'm very excited about and I think you will be as well.
(Caveats: these are ongoing discussions; none of this is final; speculation and strawman syntax ahead)
1. "Array patterns" allow matching and destructuring arrays. The `if`-line does three things:
a) is `objects` a `String` array with length 2?
b) if so, cast it to `String[]` and extract the two elements
c) declare `a` and `b` and assign the two elements to them
"Can I also bind the arrays as a whole?"
Likely. This is called an "as pattern".
"What if the array can have more elements?"
Allowing to express "at least two elements" is being considered - for example with three dots.
Yesterday evening, we spent about two hours digging through the German #Corona app and I'm thoroughly impressed. This is a modern project, developed out there as free software (APL 2.0) on GitHub, and it has stellar documentation.
Android and iOS apps use Google's/Apple's Exposure Notification Framework (ENF; google.com/covid19/exposu…, apple.com/covid19/contac…). Android app is written in Kotlin, iOS app in Swift. (Can't tell you much more because I'm clueless about mobile.)
The electoral swing analysis ("Wählerwanderung") of yesterday's state elections in Germany (e.g. @diezeit, zeit.de/politik/deutsc…) is pretty interesting and I want to comment on who switched to the radical right-wing #AfD.
🖗 Thread
All numbers are relative swing from [voters of $party in 2014 who voted in 2019] to [voters of AfD in 2019] for Sachsen / Brandenburg, i.e. "the usual numbers" normalized by 2019 voters.
In order of their share lost to #AfD, here are the big parties and then former non-voters...
It's pretty obvious that there's no arguing with extremists. Retaining ~90% of voters from one election to the next is "impressive", even for the traditionally stubborn right part of the political spectrum.
I just got my (electronic) copy of #EffectiveJava3E and am reading the new parts. Will tweet a little about it...
Nothing spectacular going on with Optional (of course I started with that, what did you think?!) until close to the end. "Optional fields are a smell, but here's an example, where it's justified".