Pattern matching for instanceof
Bind en variabel, mens typen testes
Pattern matching for instanceof er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Mønstermatchning for instanceof
Den gamle måde at bruge instanceof på var at teste og derefter caste. Mønstermatchning kombinerer testen og castet i ét trin og binder en variabel med type, når testen lykkes.
Den gamle standardkode
Klassisk kode kontrollerer typen og caster derefter til en ny variabel. Det er gentagende og let at få galt.
public class Main {
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
}
}Den nye form
Et typemønster erklærer variablen inline: if (obj instanceof String s). Når betingelsen er sand, er s allerede den castede værdi.
public class Main {
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String s) {
System.out.println(s.length());
}
}
}Bindingsvariablen
Variablen s kaldes en mønstervariabel. Den er inden for omfanget overalt, hvor compileren kan bevise, at mønsteret matchede, hvilket gør koden både kortere og sikrere.
Brug i betingelser
I den samme if-betingelse kan du bruge mønstervariablen efter &&, fordi matchningen er garanteret på den gren.
public class Main {
public static void main(String[] args) {
Object obj = "developer";
if (obj instanceof String s && s.length() > 5) {
System.out.println("Long string: " + s);
}
}
}Negation og flowomfang
Ved negation vendes omfanget intelligent. Efter if (!(obj instanceof String s)) return; er variablen s inden for omfanget resten af metoden, fordi koden kun fortsætter, når matchningen var sand.
public class Main {
static int safeLength(Object obj) {
if (!(obj instanceof String s)) {
return -1;
}
return s.length();
}
public static void main(String[] args) {
System.out.println(safeLength("abc"));
System.out.println(safeLength(42));
}
}Erstatning af equals og cast
Et lærebogseksempel er en ren tilsidesættelse af equals: test typen og bind den i én linje, og sammenlign derefter felterne.
public class Main {
static final class Point {
final int x, y;
Point(int x, int y) { this.x = x; this.y = y; }
public boolean equals(Object o) {
return o instanceof Point p && p.x == x && p.y == y;
}
public int hashCode() { return x * 31 + y; }
}
public static void main(String[] args) {
System.out.println(new Point(1, 2).equals(new Point(1, 2)));
System.out.println(new Point(1, 2).equals(new Point(3, 4)));
}
}Håndtering af blandede typer
Kædede else if-grene med mønstre gør det muligt at vælge mellem flere mulige typer på en enkel måde.
public class Main {
static String describe(Object obj) {
if (obj instanceof Integer i) {
return "int " + (i * 2);
} else if (obj instanceof String s) {
return "string of length " + s.length();
} else {
return "unknown";
}
}
public static void main(String[] args) {
System.out.println(describe(21));
System.out.println(describe("hello"));
System.out.println(describe(3.14));
}
}null bliver aldrig matchet
Et instanceof-mønster er false, når værdien er null, ligesom den klassiske operator. Mnstervariablen bindes derfor aldrig til null, hvilket fjerner en almindelig kilde til NPE'er.
public class Main {
public static void main(String[] args) {
Object obj = null;
if (obj instanceof String s) {
System.out.println("matched: " + s);
} else {
System.out.println("null or not a String");
}
}
}Renere og sikrere kode
Mønstermatchning fjerner den overflødige typekonvertering, begrænser variablens synlighedsområde, så du ikke kan bruge den forkert, og kan næsten læses som almindeligt sprog. Det er den foretrukne stil i moderne Java.
Sæt det hele sammen
En lille komponent, der formaterer forskellige inddata ved hjælp af mønstre.
public class Main {
static String format(Object o) {
if (o instanceof Double d) return String.format("%.1f", d);
if (o instanceof Integer i) return Integer.toString(i);
if (o instanceof String s && !s.isBlank()) return s.trim();
return "n/a";
}
public static void main(String[] args) {
System.out.println(format(3.14159));
System.out.println(format(99));
System.out.println(format(" spaced "));
System.out.println(format(null));
}
}Hurtig kontrol
Test din forståelse af instanceof-mønstre.
Opsummering
Du har lært mønstermatchning med instanceof.
- Det kombinerer type-testen og typekonverteringen i ét udtryk.
- Mnstervariablen har kun gyldighed i det område, hvor matchningen er bevist.
- Mønstre er false for null, så NPE'er undgås.
- Det forenkler tilsidesættelser af equals og typebaseret valg.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Pattern matching for instanceof” gratis?
Ja — hele teksten til “Pattern matching for instanceof” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Pattern matching for instanceof”?
Bind en variabel, mens typen testes Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Pattern matching for instanceof”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Pattern matching for instanceof
- Record patterns
- Indlejrede record patterns
- Patterns i switch