Python'da şunları yapabilirsiniz:
from a import b as c
Çatışan iki ithalatım olduğu için bunu Java'da nasıl yaparsınız?
Python'da şunları yapabilirsiniz:
from a import b as c
Çatışan iki ithalatım olduğu için bunu Java'da nasıl yaparsınız?
Yanıtlar:
Java'da içe aktarma yumuşatma mekanizması yoktur. Aynı ada sahip iki sınıfı içe aktaramaz ve her ikisini de niteliksiz olarak kullanamazsınız.
Bir sınıfı içe aktarın ve diğeri için tam adı kullanın, yani
import com.text.Formatter;
private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
import [fully-qualified-name] as [ident]
. Anahtar kelime yanı Java sığacak gibi görünmüyor “gibi” alternatif yaklaşık neyi C # kullanımdır: import [ident] = [fully-qualified-name]
.
Daha önce belirtildiği gibi, Java bu özelliği sağlamaz.
JDK-4194542: sınıf adı takma adı veya JDK-4214789: İçe aktarılan türün yeniden adlandırılmasına izin vermek için içe aktarmayı genişlet gibi bu özelliğin uygulanması için birçok kez istendi .
Yorumlardan:
Bu zaruri olmasa da, mantıksız bir talep değildir. Tam olarak nitelenmiş adların nadiren kullanılması gereksiz bir yük değildir (kütüphane aynı basit adları sağ ve sol olarak yeniden kullanmazsa, bu da kötü stildir).
Her durumda, bir dil değişikliği için fiyat / performans çubuğunu geçmez.
Bu yüzden yakında Java'da bu özelliği görmeyeceğiz :-P
Muhtemelen Groovy'nin bu özelliğe sahip olduğunu belirtmek gerekir :
import java.util.Calendar
import com.example.Calendar as MyCalendar
MyCalendar myCalendar = new MyCalendar()
import com.example.{Calendar => MyCalendar}
import com.example.Calendar as MyCalendar
.
class MyCalendar extends com.example.Calendar {}
? İdeal ya da hoş değil, ama düşünmek gibi pek çok amaca hizmet etmeli. Gerekirse bir yorum ile başa bile ekleyebilirsiniz /* import com.example.Calendar as MyCalendar */
.
Bugün bu takma ad özelliğiyle ilgili olarak OpenJDK'ya bir JEP taslağı hazırladım. Umarım tekrar gözden geçireceklerdir.
Eğer ilgileniyorsanız, burada bir JEP taslağı bulabilirsiniz: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7
Aslında, böyle bir şey yaparak kodunuzda daha kısa adlar kullanabilmeniz için bir kısayol oluşturmak mümkündür:
package com.mycompany.installer;
public abstract class ConfigurationReader {
private static class Implementation extends com.mycompany.installer.implementation.ConfigurationReader {}
public abstract String getLoaderVirtualClassPath();
public static QueryServiceConfigurationReader getInstance() {
return new Implementation();
}
}
Bu şekilde, uzun adı yalnızca bir kez belirtmeniz gerekir ve istediğiniz kadar özel olarak adlandırılmış sınıfınız olabilir.
Bu desenle ilgili sevdiğim bir başka şey de, uygulayıcı sınıfı soyut temel sınıfla aynı şekilde adlandırabilmeniz ve sadece farklı bir ad alanına yerleştirebilmenizdir. Bu, içe aktarma / yeniden adlandırma modeliyle ilgisizdir.