2 Şubat 2014 Pazar

Değişken Uzunlukta Argüman Alan Metodlar (Variable-Arity Method) - Java

    Merhaba arkadaşlar bu yazımda kaç tane argüman alacağımızı bilmediğimiz metodları yazmayı anlatacağım. Bu metodlar fazlasıyla ihtiyaç duyulan metodlar olup jdk 5 'ten itibaren aramızda olan bir özelliktir. Daha önceleri (o kadar uzun süredir uğraşmıyorum araştırmalarıma göre :) ) dizi ile yapılması tercih ediliyormuş. Yani siz methodunuza bir dizi geleceğini düşünerek işlem yapıyorsunuz. Kullanıcı ise diziyi doldurup size gönderiyor. Tabi ki bu durumda kullanıcı (client) tarafına çok iş düştüğünden java 'da bir güzellik bulmuşlar şimdi ona bir bakalım.

    Bu özelliğin kullanımı şu şekildedir.

void Test(int ... v); 

    Bu prototip şunu söylemektedir. Bana int türünden parametre gönder sayısı önemli değil. Olay tamamen bundan ibaret şimdi birde neler yapabiliriz neler yapamayız neler yaparsak hata olur onlara bir bakalım.

    Öncelikle fonksiyonumuz birden fazla parametrenin yanında değişken uzunluklu argüman alabilir. Örnek kod ile gösterirsek.


void f1(double x, int ... v); 
void f2(int x, int ... v);
void f3(int x, double, y, int ... v);

gibi;

    Fakat kurallarımızdan birincisi gördüğünüz gibi değişken uzunluklu argüman en sonda olmalı. Bilmemiz gereken bir diğer kural ise sadece bir adet değişken uzunluklu argüman bulunmalı.


void foo(double x, int ... v, boolean ... b); //Hata 


    Kurallarımız bu kadar bu kurallara uyduk şimdi ise overload mekanizmasını bu fonksiyonlarda nasıl kullanırız onlara bakalım.

        Değişken Uzunluklu Argüman Alan Fonksiyonlarda Overloading

    Overload mekanizması (bkz. ) aynı isimle farklı parametreli fonksiyonlar yazmak için işimize yarıyordu. Şimdi değişken uzunluklu argüman alan fonksiyonlarda bu olay nasıl oluyor ne gibi sorunlarla karşılaşabiliriz ona bakacağız. Overload mekanizması yine aynı mantıkla çalışmakta imzaları farklı olduğu sürece overload olmaktadır. Örnek ile gösterirsek;


void foo(int ... v); //1. Fonk
void foo(boolean ... v); //2. Fonk
void foo(double x, int ... v); //3. Fonk
void foo(double x, int y, int ... v); //4. Fonk
void foo(int x, int ... v); //5. Fonk  

    Gördüğünüz gibi overlaod mekanizması hepsi için geçerli fakat tabi bu fonksiyonları overload ederken dikkat etmemiz gereken noktalar var. 1. fonksiyon ,  2.-3.-4.  overload edilebilir bir sıkıntı çıkarmaz. Fakat 5. ile edilebilmesine rağmen eğer ki fonksiyon foo(1); gibi tek bir int değer ile çağırırsak ambiguity olur. Derleyici hangi fonksiyonu çağıracağını bilemez. Aynı nedenlerden dolayı 3. ile 4. fonksiyonları da bir arada bulundurmak aynı hatayı karşınıza getirebilir. Eğer foo(2.1, 1); ile fonksiyon çağırılırsa ambiguity olur derleyici hangisini çağıracağını bilemez ve hata oluşur.
    Değişken uzunluklu argüman alan fonksiyonlar sıfır argüman "foo();" ile çalışabilir olduğunu göz önüne alarak sizde bunlara benzer hataları anlayabilirsiniz.

   Yazımızın sonuna geldik başka bir yazıda görüşmek üzere umarım faydalı olmuştur.

Hiç yorum yok:

Yorum Gönder