Ubah Nama Impor di Jawa, atau impor dua kelas dengan nama yang sama


363

Dengan Python Anda dapat melakukan:

from a import b as c

Bagaimana Anda melakukan ini di Jawa, karena saya memiliki dua impor yang berbenturan.


19
Saya berharap java melakukan ini. Mengarah ke kelas dengan nama yang canggung.
fncomp

2
@fncomp: ..dan kode berantakan dengan banyak nama kelas yang memenuhi syarat: P
Superole

2
Java 12 masih belum memiliki ini
Janac Meena

Jawaban:


463

Tidak ada mekanisme aliasing impor di Jawa. Anda tidak dapat mengimpor dua kelas dengan nama yang sama dan menggunakan keduanya tanpa kualifikasi.

Impor satu kelas dan gunakan nama yang sepenuhnya memenuhi syarat untuk yang lain, yaitu

import com.text.Formatter;

private Formatter textFormatter;
private com.json.Formatter jsonFormatter;

16
Itu jawaban yang tepat dan untuk itu saya hanya menambahkan apa yang Anda tersirat: tidak, tidak ada sintaks alias di Jawa.
Sean Owen

19
Apakah ini masih menjadi batasan di Java 8?
HairOfTheDog

8
@HairOfTheDog Tidak, sayangnya tidak ada aliasing impor telah ditambahkan di Java8
AdrieanKhisbe

12
Ya saya setuju dengan komentar Anda linuxdan ... Java telah mengikuti cara dinosaurus dalam hal pembaruan sintaksisnya.
Kevin Parker

6
@Bozho Cara python tidak: import [fully-qualified-name] as [ident]. The “sebagai” kata kunci tampaknya tidak cocok di Jawa juga, alternatif adalah kira-kira apa C # menggunakan: import [ident] = [fully-qualified-name].
Daniel H

60

Seperti jawaban lain yang sudah dinyatakan, Java tidak menyediakan fitur ini.

Implementasi fitur ini telah diminta beberapa kali, misalnya sebagai JDK-4194542: nama kelas aliasing atau JDK-4214789: Perpanjang impor untuk memungkinkan penggantian nama dari jenis yang diimpor .

Dari komentar:

Ini bukan permintaan yang tidak masuk akal, meskipun sulit. Penggunaan sesekali nama-nama yang memenuhi syarat sepenuhnya bukanlah beban yang tidak semestinya (kecuali perpustakaan benar-benar menggunakan kembali nama-nama sederhana yang sama kanan dan kiri, yang merupakan gaya yang buruk).

Bagaimanapun, itu tidak melewati bilah harga / kinerja untuk perubahan bahasa.

Jadi saya kira kita tidak akan melihat fitur ini di Jawa dalam waktu dekat :-P


15
Wow! Anda tidak bercanda tentang "tidak (...) dalam waktu dekat", saya melihat bahwa permintaan fitur ditolak sebagai gula tidak berguna sejauh tahun 1998! Dan setiap upaya untuk membuka kembali diskusi selama 18 tahun terakhir ini telah terdampar pada referensi ke keputusan kuno itu. Saya kira akan lebih mudah untuk meyakinkan para pengembang IDE untuk mengimplementasikan ini sebagai topeng di editor daripada mencoba untuk masuk akal ke Oracle.
Superole

2
Namun, alasan lama itu benar - dalam praktiknya bentrok ini sangat jarang terjadi.
langsing

14
Saya tidak setuju bahwa bentrokan ini jarang terjadi. Orientasi objek lebih menyukai penamaan sederhana. Saya dapat memiliki Karyawan kelas dari dua perpustakaan berbeda yang melakukan hal-hal terpisah dengan seorang karyawan (misalnya).
Andrei Epure

6
@slim " dalam prakteknya bentrokan ini sangat jarang terjadi ". Tidak jelas bagi saya mengapa situasi ini akan terjadi lebih sering pada java (di mana Anda dapat memiliki 10.000+ kelas) dibandingkan dalam bahasa lain (di mana Anda biasanya memiliki kelas kurang) yang melakukan mendukung ini "gula" sintaks.
Alain Pannetier

21
Benar-benar salah. Saya menghadapi skenario yang sangat sederhana yang mungkin sangat umum dan di mana gula sintaksis ini akan sangat membantu. Penerjemahan antara model objek yang terkait, tetapi berbeda (masing-masing digunakan dalam produk terkait tetapi berbeda) yang kelasnya sebagian besar berbagi nama yang sama. Proses penerjemahan mengharuskan Anda untuk merujuk ke kedua kelas di blok kode yang sama. Dalam kasus seperti itu (yang pasti sangat umum), Jawa membuat hidup sangat sulit. Jumlah tampilan di pos ini yang akan menceritakan kisahnya kepada Anda.
hrshi1990

59

Mungkin perlu dicatat bahwa Groovy memiliki fitur ini :

import java.util.Calendar
import com.example.Calendar as MyCalendar

MyCalendar myCalendar = new MyCalendar()

15
Di Scala itu:import com.example.{Calendar => MyCalendar}
pablisco

24
Dan di Kotlin: import com.example.Calendar as MyCalendar.
KevinO

14
Dalam PHP itu: gunakan com \ example \ Kalender sebagai MyCalendar
jatuh

19
Sangat menjengkelkan melihat bahwa (setidaknya) 3 bahasa berbasis JVM (Groovy, Scala & Kotlin) memiliki fitur ini tetapi Java sendiri masih tidak ...
Matthias

2
Bagaimana dengan sesuatu seperti itu class MyCalendar extends com.example.Calendar {}? Ini tidak ideal atau cantik, tetapi seharusnya melayani sebagian besar tujuan singkat, katakanlah, refleksi. Anda bahkan dapat menambahkannya dengan komentar jika perlu, misalnya /* import com.example.Calendar as MyCalendar */.
Braden Best

21

Java tidak memungkinkan Anda untuk melakukan itu. Anda harus merujuk ke salah satu kelas dengan nama yang sepenuhnya memenuhi syarat dan hanya mengimpor yang lain.



-4

Sebenarnya dimungkinkan untuk membuat jalan pintas sehingga Anda dapat menggunakan nama yang lebih pendek dalam kode Anda dengan melakukan sesuatu seperti ini:

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

Dengan cara itu Anda hanya perlu menentukan nama panjang satu kali, dan Anda dapat memiliki banyak kelas khusus yang Anda inginkan.

Hal lain yang saya sukai dari pola ini adalah Anda dapat memberi nama kelas implementasinya sama dengan kelas dasar abstrak, dan letakkan saja di namespace yang berbeda. Itu tidak terkait dengan pola impor / penggantian nama.


18
Ini adalah solusi yang sangat buruk. Itu benar-benar gagal untuk berurusan dengan statika, mungkin memerlukan pembaruan konstan, dan tidak membantu dengan masalah de / serialisasi (seperti deserialising dari xml melalui jaxb).
Insinyur Perangkat Lunak
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.