Java >> Java tutorial >  >> Tag >> new

Nye funktioner i Java 14

Denne artikel er en del af en serie:• Nye funktioner i Java 8
• Nye funktioner i Java 9
• Nye funktioner i Java 10
• Nye funktioner i Java 11
• Nye funktioner i Java 12
• Nye funktioner i Java 13
• Nye funktioner i Java 14 (aktuel artikel)• Hvad er nyt i Java 15
• Nye funktioner i Java 16
• Nye funktioner i Java 17

1. Oversigt

Java 14 udgivet den 17. marts 2020, præcis seks måneder efter dens tidligere version i henhold til Javas nye udgivelseskadence.

I dette selvstudie skal vi se på en oversigt over nye og forældede funktioner i version 14 af sproget .

Vi har også mere detaljerede artikler om Java 14, der giver et dybdegående overblik over de nye funktioner.

2. Funktioner overført fra tidligere versioner

Nogle få funktioner er blevet overført i Java 14 fra den tidligere version. Lad os se på dem én efter én.

2.1. Skift udtryk (JEP 361)

Disse blev først introduceret som en preview-funktion i JDK 12, og selv i Java 13 fortsatte de kun som preview-funktioner. Men nu skift udtryk er blevet standardiseret, så de er en del af udviklingssættet .

Hvad dette effektivt betyder er, at denne funktion nu kan bruges i produktionskode og ikke kun i preview-tilstanden, som udviklere skal eksperimentere med.

Lad os som et simpelt eksempel overveje et scenarie, hvor vi udpeger ugedage som enten ugedag eller weekend.

Forud for denne forbedring ville vi have skrevet det som:

boolean isTodayHoliday;
switch (day) {
    case "MONDAY":
    case "TUESDAY":
    case "WEDNESDAY":
    case "THURSDAY":
    case "FRIDAY":
        isTodayHoliday = false;
        break;
    case "SATURDAY":
    case "SUNDAY":
        isTodayHoliday = true;
        break;
    default:
        throw new IllegalArgumentException("What's a " + day);
}

Med skifteudtryk kan vi skrive det samme mere kortfattet:

boolean isTodayHoliday = switch (day) {
    case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> false;
    case "SATURDAY", "SUNDAY" -> true;
    default -> throw new IllegalArgumentException("What's a " + day);
};

2.2. Tekstblokke (JEP 368)

Tekstblokke fortsætter deres rejse til at få en almindelig opgradering og er stadig tilgængelige som forhåndsvisningsfunktioner.

Ud over funktionerne fra JDK 13 til at gøre flerlinjestrenge nemmere at bruge, har tekstblokke nu i deres anden forhåndsvisning to nye escape-sekvenser :

  • \:for at angive slutningen af ​​linjen, så et nyt linjetegn ikke introduceres
  • \s:for at angive et enkelt mellemrum

For eksempel:

String multiline = "A quick brown fox jumps over a lazy dog; the lazy dog howls loudly.";

kan nu skrives som:

String multiline = """
    A quick brown fox jumps over a lazy dog; \
    the lazy dog howls loudly.""";

Dette forbedrer sætningens læsbarhed for et menneskeligt øje, men tilføjer ikke en ny linje efter hund; .

3. Nye forhåndsvisningsfunktioner

3.1. Mønstermatching for instanceof (JEP 305)

JDK 14 har introduceret mønstermatching for instanceof med det formål at eliminere boilerplate-kode og gøre udviklerens liv en lille smule let.

For at forstå dette, lad os overveje et simpelt eksempel.

Før denne funktion skrev vi:

if (obj instanceof String) {
    String str = (String) obj;
    int len = str.length();
    // ...
}

Nu behøver vi ikke så meget kode for at begynde at bruge obj som streng:

if (obj instanceof String str) {
    int len = str.length();
    // ...
}

I fremtidige udgivelser vil Java komme med mønstermatchning for andre konstruktioner såsom en switch .

3.2. Optegnelser (JEP 359)

Optegnelser blev indført for at reducere gentagne boilerplate-kode i datamodel POJO'er. De forenkler den daglige udvikling, forbedrer effektiviteten og minimerer i høj grad risikoen for menneskelige fejl .

For eksempel en datamodel for en Bruger med et id og adgangskode kan ganske enkelt defineres som:

public record User(int id, String password) { };

Som vi kan se, bruger vi et nyt søgeord, optag, her . Denne simple erklæring tilføjer automatisk en konstruktør, getters, lig med , hashCode og toString metoder for os.

Lad os se dette i aktion med en JUnit:

private User user1 = new User(0, "UserOne");

@Test
public void givenRecord_whenObjInitialized_thenValuesCanBeFetchedWithGetters() {
    assertEquals(0, user1.id());
    assertEquals("UserOne", user1.password());
}

@Test
public void whenRecord_thenEqualsImplemented() {
    User user2 = user1;
    assertTrue(user1, user2);
}

@Test
public void whenRecord_thenToStringImplemented() {
    assertTrue(user1.toString().contains("UserOne"));
}

4. Nye produktionsfunktioner

Sammen med de to nye preview-funktioner har Java 14 også leveret en konkret produktionsklar.

4.1. Nyttige NullPointerExceptions (JEP 358)

Tidligere var staksporingen for en NullPointerException havde ikke meget af en historie at fortælle, bortset fra at en eller anden værdi var nul på en given linje i en given fil.

Selvom det var nyttigt, foreslog disse oplysninger kun en linje til fejlretning i stedet for at male hele billedet, så en udvikler kan forstå det, bare ved at se på loggen.

Nu har Java gjort dette nemmere ved at tilføje muligheden for at påpege, hvad der præcist var null i en given kodelinje .

Overvej f.eks. dette simple uddrag:

int[] arr = null;
arr[0] = 1;

Tidligere, når denne kode blev kørt, ville loggen sige:

Exception in thread "main" java.lang.NullPointerException
at com.baeldung.MyClass.main(MyClass.java:27)

Men nu, givet det samme scenarie, kan loggen sige:

java.lang.NullPointerException: Cannot store to int array because "a" is null

Som vi kan se, ved vi nu præcis, hvilken variabel der forårsagede undtagelsen.

5. Inkuberingsfunktioner

Dette er de ikke-endelige API'er og værktøjer, som Java-teamet kommer med og giver os mulighed for at eksperimentere. De adskiller sig fra forhåndsvisningsfunktioner og leveres som separate moduler i pakken jdk.incubator .

5.1. Foreign Memory Access API (JEP 370)

Dette er en ny API, der giver Java-programmer adgang til fremmed hukommelse, såsom native memory, uden for heapen på en sikker og effektiv måde.

Mange Java-biblioteker såsom mapDB og memcached har adgang til fremmed hukommelse, og det var på høje tid, at Java API selv tilbød en renere løsning. Med denne intention kom teamet med denne JEP som et alternativ til dets allerede eksisterende måder at få adgang til ikke-heap-hukommelse – ByteBuffer API og sun.misc.Unsafe API.

Bygget på tre hovedabstraktioner af MemorySegment , Hukommelsesadresse og MemoryLayout , er denne API en sikker måde at få adgang til både heap- og non-heap-hukommelse.

5.2. Emballageværktøj (JEP 343)

Traditionelt ville en applikationsudvikler for at levere Java-kode blot sende en JAR-fil, som brugeren skulle køre inde i deres egen JVM.

Men brugere forventede snarere et installationsprogram, som de ville dobbeltklikke på for at installere pakken på deres oprindelige platforme, såsom Windows eller macOS.

Denne JEP sigter mod at gøre netop det. Udviklere kan bruge jlink at kondensere JDK ned til det minimum, der kræves moduler, og brug derefter dette pakkeværktøj til at skabe et letvægtsbillede, der kan installeres som en exe på Windows eller en dmg på en macOS.

6. JVM/HotSpot-funktioner

6.1. ZGC på Windows (JEP 365) og macOS (JEP 364) – Eksperimentel

Z Garbage Collector, en skalerbar, lav-latency skraldeopsamler, blev først introduceret i Java 11 som en eksperimentel funktion. Men oprindeligt var den eneste understøttede platform Linux/x64.

Efter at have modtaget positiv feedback om ZGC til Linux, har Java 14 også overført sin support til Windows og macOS . Selvom det stadig er en eksperimentel funktion, er det hele klar til at blive produktionsklar i den næste JDK-udgivelse.

6.2. NUMA-Aware Memory Allocation for G1 (JEP 345)

Ikke-ensartet hukommelsesadgang (NUMA) er indtil videre ikke implementeret for G1-affaldsopsamleren, i modsætning til Parallel-opsamleren.

Ser man på ydeevneforbedringen, som den tilbyder at køre en enkelt JVM på tværs af flere sokler, blev denne JEP introduceret for også at gøre G1-samleren NUMA-bevidst .

På dette tidspunkt er der ingen plan om at kopiere det samme til andre HotSpot-samlere.

6.3. JFR Event Streaming (JEP 349)

Med denne forbedring er JDK's flight recorder data nu eksponeret, så de løbende kan overvåges. Dette involverer ændringer af pakken jdk.jfr.consumer så brugere nu kan læse eller streame optagelsesdataene direkte.

7. Forældede eller fjernede funktioner

Java 14 har forældet et par funktioner:

  • Solaris- og SPARC-porte (JEP 362) – fordi dette Unix-operativsystem og RISC-processor ikke er i aktiv udvikling siden de sidste par år
  • ParallelScavenge + SerialOld GC Combination (JEP 366) – da dette er en sjældent brugt kombination af GC-algoritmer og kræver betydelig vedligeholdelsesindsats

Der er også et par fjernelser:

  • Concurrent Mark Sweep (CMS) Garbage Collector (JEP 363) – forældet af Java 9, denne GC er blevet efterfulgt af G1 som standard GC. Der er også andre mere effektive alternativer at bruge nu, såsom ZGC og Shenandoah, derfor fjernelsen
  • Pack200 Tools and API (JEP 367) – disse blev forældet til fjernelse i Java 11 og nu fjernet

8. Konklusion

I denne selvstudie kiggede vi på de forskellige JEP'er i Java 14.

I alt er der 16 hovedfunktioner i denne udgivelse af sproget , herunder preview-funktioner, kuvøser, afskrivninger og fjernelser. Vi kiggede på dem alle én efter én, og sproget med eksempler.

Som altid er kildekoden tilgængelig på GitHub.

Næste » Hvad er nyt i Java 15« ForrigeNye funktioner i Java 13
Java tag