SORU
4 Temmuz 2014, Cuma


Java İsim Gizleme: Zor Yoldan

Çok çözülmesi zor olan isim gizleme ile ilgili bir sorun var. Burada sorunu açıklayan basitleştirilmiş bir versiyonu:

Bir sınıf var: org.A

package org;
public class A{
     public class X{...}
     ...
     protected int net;
}

O zaman 7* *bir sınıf yoktur

package net.foo;
public class X{
     public static void doSomething();
}

Ve şimdi, burada A devraldığı ve net.foo.X.doSomething() aramak isteyen sorunlu bir sınıftır

package com.bar;
class B extends A {

    public void doSomething(){
        net.foo.X.doSomething(); // doesn't work; package net is hidden by inherited field
        X.doSomething(); // doesn't work; type net.foo.X is hidden by inherited X
    }
}

Gördüğünüz gibi, bu mümkün değildir. Ben basit kalıtsal bir türü tarafından gizli olduğu için X ad kullanın. Edemem tam adı net kalıtsal bir alan tarafından gizli çünkü net.foo.X kullanın.

Sadece sınıfı B benim kod tabanı; net.foo.X org.A bunu kütüphane sınıfları, sınıflar onları değiştirmek!

Benim için de tek çözüm bu gibi görünüyor: Sırayla X.doSomething(); ama bu sınıf çok dağınık görünüyor adı the clash, çünkü mevcut çağıran başka bir sınıf diyebilirim! İçinde doğrudan B.doSomething() X.doSomething() çağırabilirim çözüm var mı?

Bir dil sağlayan belirten genel ad, örneğin, global:: C# veya :: C , elimden sadece önek net ile bu küresel önek, ama Java izin vermez.

CEVAP
4 Temmuz 2014, Cuma


Türü için null alçı ve yöntemini hedef nesne statik yöntemleri çağırma dahil olmadığı için çalışacak olan () çağırmak.

((net.foo.X) null).doSomething();

Bu faydaları vardır

  • -yan etkisi ücretsiz (net.foo.X başlatmasını ile ilgili bir sorun)
  • gerektirmeyen renaming bir şey (bu kadar verebilirsiniz yöntemi B adını istediğin için var; bu yüzden bir import static işe yaramaz senin kesin vaka),
  • temsilci sınıf tanıtımı (gerçi bu iyi bir fikir olabilir...) gerektirmeyen, ve
  • yansıma API ile çalışan yük ya da karmaşıklığı gerektiren değil.

Dezavantajı bu kod gerçekten korkunç! Benim için, bir uyarı oluşturur, ve bu genelde iyi bir şeydir. Ama aksi halde iyice pratik bir sorunu çözmek için çalışıyor etrafında olduğu için, bir ekleme

@SuppressWarnings("static-access")

uygun bir (en az!) nokta kapsayan derleyici susacak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dion Coulls

    Dion Coulls

    16 AĞUSTOS 2006
  • MagicofRahat

    MagicofRahat

    13 Temmuz 2007
  • UniqueApps

    UniqueApps

    4 Ocak 2009