4 Ağustos 2020 Salı

Class.isInstance metodu

Giriş
if (Foo.class.isInstance(object)) {

  Foo foo = Foo.class.cast(object)
  ...
}
şeklinde kullanılır. Belirtilen nesnenin bu sınıf tipinden olup olmadığını döner.

Örnek
Şöyle yaparız.
Class<?> c = ...;
Object obj = ...;
if (c.isInstance(obj)) {...}
Örnek
Logical OR kullanmamak için şöyle yaparız. Burada stream.anyMatch() kullanılıyor
List<Class<? extends SqlDialect>> supportedDialects = Arrays.asList(
            MysqlSqlDialect.class,
            PostgresqlSqlDialect.class,
            H2SqlDialect.class);

// Returns if upsert is supported for the given dialect
boolean isUpsertDialectSupported(JdbcTable jdbcTable) {

  SqlDialect dialect = jdbcTable.sqlDialect();

  return supportedDialects.stream().anyMatch(clazz -> clazz.isInstance(dialect));

}
Örnek
Eğer nesne içinde planes diye bir liste varsa ve bu listeyi belirtilen sınıf tipine göre filtrelemek istersek şöyle yaparız
public <T extends Plane> List<T> getPlanes(Class<T> claz) {
  List<T> result = new ArrayList<>();
  for (Plane plane : planes) {
    if (claz.isInstance(plane)) {
      result.add(claz.cast(plane));
    }
  }
  return result;
}
Aynı şeyi for döngüsü yerine şöyle de yapabiliriz.
public <T> List<T> getTPlanes(Class<T> clazz) {
  List<T> tPlanes = new ArrayList<>();

  planes.stream() 
    .filter(clazz::isInstance)
    .forEach((p) -> tPlanes.add((T) p));

  return tPlanes;
}

Hiç yorum yok:

Yorum Gönder