Java'da İçe Aktarma Adını değiştirme veya aynı ada sahip iki sınıfı içe aktarma


363

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?


19
Keşke java bunu yapsaydı. Garip isimlerle sınıflara yönelir.
fncomp

2
@fncomp: ..ve tam olarak nitelenmiş çok sayıda isim içeren dağınık kod: P
Superole

2
Java 12 hala buna sahip değil
Janac Meena

Yanıtlar:


463

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;

16
Bu doğru cevap ve ben sadece ima ettiğin şeyi ekliyorum: hayır, Java'da böyle bir takma sözdizimi yok.
Sean Owen

19
Java 8'de hala bir sınırlama var mı?
HairOfTheDog

8
@HairOfTheDog Hayır, ne yazık ki Java8'e hiçbir ithalat takma adı eklenmedi
AdrieanKhisbe

12
Evet yorumuna katılıyorum linuxdan ... Java, sözdizimindeki güncellemeler açısından dinozorun yolunu tuttu.
Kevin Parker

6
@Bozho yolu piton yapar: 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].
Daniel H

60

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


15
Vaov! "yakında (...) her zaman değil" hakkında şaka yapmıyordum, özellik talebinin 1998'e kadar anlamsız şeker olarak reddedildiğini görüyorum! Ve bu son 18 yıl boyunca tartışmayı yeniden açma girişimleri, bu eski karara bir atıfta bulundu. Sanırım IDE-geliştiricilerini bunu editörde bir maske olarak uygulamaya ikna etmek Oracle'a mantıklı gelmekten daha kolay olurdu.
Superole

2
Eski akıl yürütme doğrudur - pratikte bu çatışmalar çok nadiren meydana gelir.
ince

14
Bu çatışmaların nadiren meydana geldiğini kabul etmiyorum. Nesne yönelimi basit adlandırmayı destekler. Bir çalışanla ayrı şeyler yapan iki farklı kütüphaneden bir Sınıf Çalışanı alabilirim (örneğin).
Andrei Epure

6
@slim " pratikte bu çatışmalar çok nadiren meydana gelir ". (Eğer 10.000'den sınıfları içebileceğiniz) bu durumlar (genellikle daha az sınıfları) diğer dillere göre daha java az sıklıkla meydana neden Bana belli değil yapmak bu "şeker" sözdizimi destekler.
Alain Pannetier

21
Kesinlikle yanlış. Muhtemelen çok yaygın olan ve bu sözdizimsel şekerin son derece yararlı olacağı çok basit bir senaryo ile karşı karşıyayım. Sınıfları çoğu zaman aynı adı paylaşan ilişkili, ancak farklı nesne modelleri (sırasıyla ilgili ancak farklı ürünlerde kullanılır) arasındaki çeviri. Çeviri işlemi, aynı kod bloğundaki her iki sınıfa da başvurmanızı gerektirir. Böyle bir durumda (çok yaygın olması gerekir), Java hayatı çok zorlaştırır. Sadece bu yayındaki görüntüleme sayısı size hikayeyi anlatmalıdır.
hrshi1990

59

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()

15
Scala'da:import com.example.{Calendar => MyCalendar}
pablisco

24
Ve KOTLIN içinde: import com.example.Calendar as MyCalendar.
KevinO

14
PHP'de: com \ example \ Calendar'ı MyCalendar olarak kullanın
matang

19
En azından 3 JVM tabanlı dilin (Groovy, Scala & Kotlin) bu özelliğe sahip olduğunu görmek oldukça can sıkıcı ama Java'nın kendisi hala yok ...
Matthias

2
Nasıl bir şey 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 */.
Braden Best

21

Java bunu yapmanıza izin vermiyor. Sınıflardan birine tam adıyla başvurmanız ve yalnızca diğerini içe aktarmanız gerekir.



-4

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.


18
Bu çok zayıf bir çözüm. Statiklerle tamamen başa çıkmaz, sürekli güncellemeler gerektirebilir ve / serileştirme sorunlarına yardımcı olmaz (xml'den jaxb'ye serileştirme gibi).
Yazılım Mühendisi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.