SORU
7 Kasım 2008, Cuma


Kaçınarak=! boş açıklamaları

Java ile programlama yaparken en çok kullandığınız deyim kullanmaya başlamadan önce object != null eğer test etmektir. Bu NullPointerException kaçınmaktır. Kod çok çirkin buluyorum ve okunmaz hale gelir.

Bu iyi bir alternatif var mı?

Eğer bu nesne, alan veya yöntem erişmek istiyorsanız her nesne test gereğine de işaret etmek istiyorum. Örneğin:

if (someobject != null) {
    someobject.doCalc();
}

Bu durumda NullPointerException ve ben eğer nesne null ise tam olarak bilmiyorum ya da değil sorun çıkmaz. Benim kod bu testler bulanmak.

CEVAP
7 Kasım 2008, Cuma


Bu bana geliyor gibi oldukça yaygın bir sorun olan junior Ara geliştiriciler eğilimi yüze bir noktada: ya bilmiyor ya da güvenmiyor sözleşmeleri onlar katılan ve defansif overcheck için boşluk. Kendi kod yazarken, ayrıca, null bir şey böylece arayanın boşluk kontrol gerektiren belirtmek için dönen güveniyor eğilimindedir.

Bu başka bir deyişle, null kontrolü gelen iki kopyası vardır:

  1. Boş sözleşme açısından geçerli bir yanıt olduğu;

  2. Geçerli bir yanıt değil.

(2) kolay. assert ifadeler (iddialar) veya başarısız olduğu (örneğin, NullPointerException) izin ya. İddialar 1.4 eklenen son derece kullanışsız bir Java özelliği vardır. Sözdizimi:

assert <condition>

ya

assert <condition> : <object>

<condition> boolean bir ifadedir ve <object> çıkış olan bir nesne nerede hata eklenecektir.

assert deyimi eğer koşul doğru değilse Error (AssertionError) atar. Varsayılan olarak, Java iddialar yok sayıyor. JVM seçeneği -ea ileterek iddialar etkinleştirebilirsiniz. Etkinleştirmek ve bireysel sınıfları ve paketleri iddialar devre dışı bırakabilirsiniz. Bu geliştirme ve test, ve benim test performans etkisi yanında iddialar çıkmıştır, ancak üretim ortamında onları devre dışı ise iddialar ile kodu doğrulama anlamına gelir.

Bu durumda onaylamaları kullanarak kod eğer iddialar kullanırsanız ne olacağını sadece başarısız, çünkü TAMAM. Tek fark bu iddialar belki de başına er, bir daha anlamlı bir şekilde ve muhtemelen ekstra bilgi konuda size yardımcı olabilecek anlamaya neden oldu olmasan bekliyor.

(1) daha küçük. Eğer aradığınız bu kod üzerinde herhangi bir kontrolü varsa kaldın. Null geçerli bir yanıt varsa, bunu kontrol etmek zorunda.

Eğer kontrolü yapmak kod varsa, ancak (ve bu çoğu zaman böyledir), o zaman farklı bir hikaye. Cevap olarak boşluk kullanmaktan kaçının. Dönüş koleksiyon, kolay yöntemler ile: null hemen hemen her zaman yerine boş dönmek koleksiyonları (veya dizileri).

-Koleksiyonları sigara ile zor olabilir. Eğer bu arabirimler: bir örnek olarak şunu düşünün:

public interface Action {
  void doSomething();
}

public interface Parser {
  Action findAction(String userInput);
}

Ayrıştırıcı çiğ kullanıcı girdi alır ve bir şeyler yapmak için bulduğu yerde, belki bir komut satırı Uygulama Eğer bir şey için arayüz. Şimdi ise uygun bir eylem varsa orada hiçbir boş döndüren sözleşme yapabilirsiniz. Bu boş bahsediyorsun kontrol açar.

Alternatif bir çözüm asla boş döner ve yerine Null Object pattern kullanmak için:

public class MyParser implements Parser {
  private static Action DO_NOTHING = new Action() {
    public void doSomething() { /* do nothing */ }
  };

  public Action findAction(String userInput) {
    // ...
    if ( /* we can't find any actions */ ) {
      return DO_NOTHING;
    }
  }
}

Karşılaştırın:

Parser parser = ParserFactory.getParser();
if (parser == null) {
  // now what?
  // this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
  // do nothing
} else {
  action.doSomething();
}

için

ParserFactory.getParser().findAction(someInput).doSomething();

daha kısa kod yol açar, çünkü çok daha iyi bir tasarım.

Bu, belki de findAction için tamamen uygun olduğunu söyledi() yöntemine kullanıcı girişi dayanarak nerede anlamlı bir hata iletisi özellikle bu durumda olan bir özel Durum. FindAction yöntemi hiçbir açıklama yapmadan basit bir NullPointerException ile havaya uçurmak için arama yöntemi için daha bir özel Durum için çok daha iyi olurdu.

try {
    ParserFactory.getParser().findAction(someInput).doSomething();
} catch(ActionNotFoundException anfe) {
    userConsole.err(anfe.getMessage());
}

Ya eğer bu mekanizma çok çirkin yakalamak yerine, hiçbir Şey yapmadan, varsayılan eylem/deneyin düşünüyorsan kullanıcı geribildirim sağlamak gerekir.

public Action findAction(final String userInput) {
    /* Code to return requested Action if found */
    return new Action() {
        public void doSomething() {
            userConsole.err("Action not found: "   userInput);
        }
    }
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matus Slovak

    Matus Slovak

    5 Temmuz 2007
  • michal lelkowski

    michal lelko

    9 Temmuz 2006
  • TechXCentral

    TechXCentral

    12 Temmuz 2011