SORU
8 HAZİRAN 2009, PAZARTESİ


Java isteğe bağlı parametreler

Nasıl Java isteğe bağlı parametreler kullanırım? Ne belirtimi isteğe bağlı parametreleri destekler?

CEVAP
21 EKİM 2012, Pazar


Java isteğe bağlı parametreleri simüle etmek için çeşitli yollar vardır:

  1. Yöntemi aşırı.

    void foo(String a, Integer b) {
        //...
    }
    
    void foo(String a) {
        foo(a, 0); // here, 0 is a default value for b
    }
    
    foo("a", 2);
    foo("a");
    

    Bu yaklaşım sınırlamaları biri eğer aynı türden iki isteğe bağlı parametreler varsa hiçbir işe yaramaz, ve onları herhangi bir ihmal olabilir.

  2. Varargs.

    a) isteğe bağlı parametreler aynı türden

    void foo(String a, Integer... b) {
        Integer b1 = b.length > 0 ? b[0] : 0;
        Integer b2 = b.length > 1 ? b[1] : 0;
        //...
    }
    
    foo("a");
    foo("a", 1, 2);
    

    b) isteğe bağlı parametre Türleri farklı olabilir:

    void foo(String a, Object... b) {
        Integer b1 = 0;
        String b2 = "";
        if (b.length > 0) {
          if (!(b[0] instanceof Integer)) { 
              throw new IllegalArgumentException("...");
          }
          b1 = (Integer)b[0];
        }
        if (b.length > 1) {
            if (!(b[1] instanceof String)) { 
                throw new IllegalArgumentException("...");
            }
            b2 = (String)b[1];
            //...
        }
        //...
    }
    
    foo("a");
    foo("a", 1);
    foo("a", 1, "b2");
    

    Bu yaklaşımın ana dezavantajı ise isteğe bağlı parametreler farklı türleri statik tip kontrolü kaybetmek. Eğer her parametre farklı bir anlamı varsa ayrıca, bir şekilde onları ayırt etmeniz gerekir.

  3. Null.Boş değerlere izin verebilirsiniz önceki yaklaşımların sınırlamaları adres ve yöntemi, vücuttaki her bir parametrenin analiz:

    void foo(String a, Integer b, Integer c) {
        b = b != null ? b : 0;
        c = c != null ? c : 0;
        //...
    }
    
    foo("a", null, 2);
    

    Şimdi tüm değişkenler değerleri sağlanmalıdır, ancak varsayılan olanları boş olabilir.

  4. İsteğe bağlı sınıf.Bu yaklaşım, değerlere benzer, ancak varsayılan değere sahip parametreler için guava İsteğe bağlı sınıf kullanır:

    void foo(String a, Optional<Integer> bOpt) {
        Integer b = bOpt.isPresent() ? bOpt.get() : 0;
        //...
    }
    
    foo("a", Optional.of(2));
    foo("a", Optional.<Integer>absent());
    

    Yöntem bir kontrat arayan bir kişi için açık hale getirir isteğe bağlı, ancak böyle bir imza da ayrıntılı bulabilirsiniz.

    Güncelleme: sınıf içerir Java 8 12* *java 8'de özellikle bu nedenle guava kullanmaya gerek yok yani out-of-the-box,. Yöntem isimleri biraz farklı olsa da.

  5. Builder deseni.Builder deseni kurucular için kullanılır ve ayrı Oluşturucu bir sınıf getirerek uygulanır:

     class Foo {
         private final String a; 
         private final Integer b;
    
         Foo(String a, Integer b) {
           this.a = a;
           this.b = b;
         }
    
         //...
     }
    
     class FooBuilder {
       private String a = ""; 
       private Integer b = 0;
    
       FooBuilder setA(String a) {
         this.a = a;
         return this;
       }
    
       FooBuilder setB(Integer b) {
         this.b = b;
         return this;
       }
    
       Foo build() {
         return new Foo(a, b);
       }
     }
    
     Foo foo = new FooBuilder().setA("a").build();
    
  6. Haritalar.Parametre sayısı çok büyük ve çoğu için varsayılan değerler genellikle kullanıldığında, isimlerini haritası olarak yöntem bağımsız değişkenleri ve değerleri: iletebilirsiniz

    void foo(Map<String, Object> parameters) {
        String a = ""; 
        Integer b = 0;
        if (parameters.containsKey("a")) { 
            if (!(parameters.get("a") instanceof Integer)) { 
                throw new IllegalArgumentException("...");
            }
            a = (String)parameters.get("a");
        }
        if (parameters.containsKey("b")) { 
            //... 
        }
        //...
    }
    
    foo(ImmutableMap.<String, Object>of(
        "a", "a",
        "b", 2, 
        "d", "value")); 
    

Lütfen bu yaklaşımların herhangi bir arzu edilen bir sonucu elde etmek için birleştirebilirsiniz unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BenjiManTV

    BenjiManTV

    20 Mart 2011
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005