Merhaba.farz edelim ki, aşağıdaki gibi classlarımız var:

public class A{
}

public class B extends A{

}

public class C{

}

public class D{
    public static void main(String args[]){
       A a = new A();
       B b = new B();

       //shimdi B A-dan türediyi için ben şöyle bir kod yaza bilirim
       System.out.println(b instanceof A);
       //ama ben şöyle yazarsam compile error verir
       System.out.println(b instanceof C);
   }
}

sorum şu eğer instanceof compile zamanı check yapıyorsa ve extendsi zaruri yapıyorsa o zaman hep true dönderecek demekdir.Yani instanceof-un false olması demek compile error demek.Böyle olduğu için instanceof-un neden kullanıldığını anlayamıyorum.Mesela if(a==true) deyip ardıyca kod yazarız.İyi güzel mantıklı. Eğer instanceof bana false halinde compile error verecekse bu o demektir ki, programım çalışıyorsa instanceof hep true o zaman neden çek edeyim ki?Zaten neyin neden türediğini biliyorum.

en uzak ihtimalle şöyle bir sonuca varıyorum.Sistem çok büyük ve classlarım aşırı fazla.Onun için classın içine girmeden instanceofla çek yapıyorum.Ama nedense bu fikirle tatmin olmuyorum

soruldu: 17 Mar '15, 02:31

Serxan's gravatar image

Serxan
51691106107
cevap kabul oranı: 46%

değiştirildi: 17 Mar '15, 03:31


Compile error vermez bir yanlışınız olmalı. instanceof'un kullanımı şöyle anlatayım size. Şöyle bir yapınız olsun.

public interface Dosyalanabilir {
}

public class Klasor implements Dosyalabilir {
}

public class Dokuman implements Dosyalanabilir {
}

Bizim altkatmanımızda kod yazan bir uygulama geliştirici bize şöyle bir method sağlamış olsun.

DosyaDAO dosyaDAO = new DosyaDAO();

List <Dosyalanabilir> cocuklar = dosyaDAO.getRootChildren();

Böyle bir durumda çocuklar bir klasörde olabilir bir doküman da o nedenle

for (Dosyalanabilir dosya : cocuklar) {
     if(dosya instanceof Klasor) {
      //farklı bir işlem
    } else if (dosya instanceof Dokuman) {
      //farklı bir işlem
    }
}

Şeklinde yapılır. Instanceof'un en yaygın kullanım şekli budur.

permanent link

cevaplandı: 17 Mar '15, 03:31

molgun's gravatar image

molgun
1.3k1921
cevap kabul oranı: 23%

Bir örnek ile açıklamaya çalışacağım.En güzel örneği de Db işlemlerinde verebileceğimi düşünüyorum.

//Db entitilerini extend etmek için BaseModel tanımladım

public class BaseModel {
    public int version;
    public int userId;
}

//Model1 BaseModel'den miraslanan örnek modelim

public class MyModel1 extends BaseModel {
    public int id;
    public String name;
}

//Model2 BaseModel'den miraslanmayan örnek modelim

public class MyModel2{
    public int id;
    public String name;
}

//Db İşlemlerini yapmak için DBProcess adında bir sınıfım olduğunu ve tüm db işlemleri bu sınıf üzerinden yapacağımı farz edelim. Parametre olarakta Object türünde poco objesini alsın

public class DbProcess {
    public void Insert(Object poco)
    {
        //Eğer gönderilen entity'im BaseModelden inherit edilmiş ise
        //userId ve version field'larını set'lemekliyim
        if (poco instanceof  BaseModel) { 
            BaseModel base=(BaseModel)poco;
            base.userId= GetCurrentUser().userId; //Login olan kullanıcın id_si
            base.version =1; //insert yapacağım için version'u 1 yapıyorum

        }
        //Db ye insert işlemi yapılıyor
        Db.Insert(poco);
    }
}

Yukarıdaki senaryo üzerinden açıklamaya çalışırsam eğer. DbProcess içerisindeki Insert metoduna gelen poco objesinin türünü bilmiyoruz. Ya reflection ile içine dalıp anlayama çalışacağız. Yada kısa yoldan BaseModel'den misaralım miraslanmadığı anlamaya çalışacağız. Eğer "if (poco instanceof BaseModel)" burada true değerini dönerse demekki BaseModelden miraslanmıştır. O zaman BaseModele cast ederim ve fieldlarımı set'lerim. Çok daha basit ve hızlı bir yöntemle amacıma ulaşmış olurum. Yani Model1 i insert etmek istediğimizde,BaseModelden misarlandığı için if true olacaktır,version ve userId değerleri girilecektir. Model2 insert edilmek istediğinde false olacaktır, version,userId setlenmeyecektir. Umarım yeterli olmuştur açıklamam.

İyi çalışmalar.

permanent link

cevaplandı: 17 Mar '15, 03:39

M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Müslüm ÖZTÜRK
10.7k103691
cevap kabul oranı: 28%

değiştirildi: 17 Mar '15, 03:42

Cevaplarınız için teşekkür ederim.Ben bir şeyin de farkına vardım.Sorumu güncelledim.

Bir biriyle alakasız classları instanceof ile check edemiyoruz.

A extends B,B extends C,C extends D ve bir E clasımız var

ben

if(a instance of D)

deye bilirim.amma if(a instance of E) diyemiyorum. mesela böyle bir method yaza bilirim çünkü tüm classlar Object-den türemiş

public void check(Object o){
    if(o instanceof A){
    }else if(o instanceof E){
}
permanent link

cevaplandı: 17 Mar '15, 04:46

Serxan's gravatar image

Serxan
51691106107
cevap kabul oranı: 46%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×6

Soruldu: 17 Mar '15, 02:31

Görüntüleme: 443 kez

Son güncelleme: 17 Mar '15, 04:46

powered by BitNami OSQA