24 Ekim 2017 Salı

instanceof Anahtar Kelimesi ve Pattern Matching

Giriş
instanceof anahtar kelimesi biraz evrilerek artık pattern matching için de kullanılabiliyor

1. Klasik Kullanım
Sınıfın gerçekte hangi tip olduğunu anlamak için kullanılır.

Örnek
Elimizde şöyle bir hiyerarşi olsun
class Shape {
  ...
}
class Circle extends Shape {
  ...
}
Şöyle yaparız.
Shape shape = ...;
if (shape instanceof Circle)
{
  Circle C = (Circle)shape;
}
2. Pattern Matching
Java 14 JEP 305 ile geliyor. Java 16 ile dilin standardına dahil oldu. Yani artık derlemek için --enable-preview seçeneğini kullanmaya gerek yok.

Şimdilik sadece if statement için kullanılabiliyor. switch statement ile kullanılabilmesi Java 16'da yapılacak.

Örnek
Şöyle yaparız
if (animal instanceof Cat cat) {
    cat.meow();
} else if(animal instanceof Dog dog) {
    dog.woof();
}
Örnek - Derleme Hatası
Elimizde şöyle bir kod olsun
var a = new ArrayList<String>();
if (a instanceof List l) {
  System.out.println(l.size());
}
Bu kod şöyle bir derleme hatası verir. Çünkü değişken zaten List arayüzünü gerçekleştirmektedir.
Error: pattern type java.util.List is a subtype of expression type
java.util.ArrayList<java.lang.String>
Java 17 Pattern Matching
Örnek
Şöyle yaparız
class Shape {}
class Rectangle extends Shape {}
class Triangle extends Shape {}

void testTriangle(Shape s) {
  switch (s) {
    case Triangle t && (t.calculateArea() > 100) -> ...
    default -> ...
  }
}
Java 21 Pattern Matching
Örnek
Şöyle yaparız
// As of Java 16 record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x+y); } } // As of Java 21 static void printSum(Object obj) { if (obj instanceof Point(int x, int y)) { System.out.println(x+y); } }

Hiç yorum yok:

Yorum Gönder