Guava
Google Core Libraries for java
+ historietime: null
André Lindhjem
Kantega
Google java-biblioteker
collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O . .
Biblioteker som Google bruker for å gjøre Java litt enklere å leve med.
Sir Charles Antony Richard Hoare
typesystemet i ALGOL W
I call it my billion-dollar mistake. It was the invention of the null reference in 1965.
[...]
But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
null i Java
- Da ønsker vi "fail fast" istedet for at det smeller senere. DB-problematikk... Haskey()..
-
null er vag: Kan bety feil/suksess/whatever.
- Punkterer typesystemet. T betyr alltid T eller null.union type / sum type
- Oppmuntrer til if (var != null)
Ofte kan essensen forsvinne i null-sjekking.
- Collections tillater null-verdierHashMap.put("something", null);
- Collections returerner null ved manglende verdi.map.get("something"); .. må bruke containsKey().
- Årsak til mange feil . .
"top ten java errors"
(drum roll)
And the number one error that Java programmers make !!!!!
1. Null pointers!
Null pointers are one of the most common errors that Java programmers make. Compilers can't check this one for you - it will only surface at runtime, and if you don't discover it, your users certainly will.
For å ikke snakke om andre programmeringsspråk (C).Tiltak
En (blanding?) av:
- Regler / standarder
- Javadoc
- Tester
- Findbugs
- Annoteringer
Guava collections.
Living with null-hostile collections
Mange collections tillater ikke null-verdier (feks: immutable-versjoner av Set, Map, List).
Flere collections
- Multiset
- Multimap
- ClassToInstanceMap
- BiMap
- Table
- osv . .
Telle antall forekomster
Vanlig problem å komme borti.
Map<String, Integer> forekomster = new HashMap<String, Integer>();
for (String ord : alleOrd) {
Integer antall = forekomster.get(ord);
if (antall == null) {
forekomster.put(ord, 1);
} else {
forekomster.put(ord, antall + 1):
}
}
Guava-måten
Slik gjør vi det med MultiSet.
MultiSet<String> ordSett = HashMultiset.create();
ordSett.addAll(alleOrd);
// ordSett.count("sykkel"); antall som "int".
Optional<T>
-
Optional brukes der vi i dag bruker null for å indikere fravær av verdi.
- Idiot-sikring - utvikler må aktivt ta stilling til at en Optional kan ha "fravær av verdi".
Erfaringer fra feks Scala - NPE forekommer skjeldent.
- Erfaringer fra språk med liknende typer er at problemer rundt null nesten ikke forekommer.
Option i Scala, Maybe i Haskell
Optional<T>
Med verdi.
Optional<Integer> kanskje = Optional.of(5);
kanskje.isPresent(); // true
kanskje.get(); // returnerer 5
Fravær av verdi.
Optional<Integer> kanskje = Optional.absent(); // tom verdi
kanskje.isPresent(); // false
kanskje.or(6); // returnerer 6
kanskje.asSet(); // returnerer et tomt sett.
kanskje.get(); // IllegalStateException!
Generelt om guava
Ikke rocket science, men:
- Mange brukere.
-
Mye vekt på API-design.
- Brukes i "inner loop"-tilfeller.