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
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 birimport 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.
Kurallı, isim, basit isim ve Java Ders...
Neden Java bize bir isim dosya adından...
Java "-by pass-başvuru" veya...
= Operatörü Java...
Neden char[] şifreler için Dize Java t...