Thay đổi tên của nhập trong Java hoặc nhập hai lớp có cùng tên


363

Trong Python bạn có thể thực hiện:

from a import b as c

Làm thế nào bạn sẽ làm điều này trong Java, vì tôi có hai lần nhập đang xung đột.


19
Tôi ước java đã làm điều này. Dẫn đến các lớp học với tên khó xử.
fncomp

2
@fncomp: ..và mã lộn xộn với rất nhiều tên lớp đủ điều kiện: P
Superole

2
Java 12 vẫn không có điều này
Janac Meena 22/07/19

Câu trả lời:


463

Không có cơ chế răng cưa nhập khẩu trong Java. Bạn không thể nhập hai lớp có cùng tên và sử dụng cả hai lớp không đủ tiêu chuẩn.

Nhập một lớp và sử dụng tên đủ điều kiện cho lớp kia, nghĩa là

import com.text.Formatter;

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

16
Đó là câu trả lời đúng và tôi chỉ thêm vào những gì bạn đã ngụ ý: không, không có cú pháp răng cưa như vậy trong Java.
Sean Owen

19
Đây có còn là một hạn chế trong Java 8 không?
HairOfTheDog

8
@HairOfTheDog Không, không may không có bí danh nhập khẩu đã được thêm vào trong Java8
AdrieanKhisbe

12
Vâng, tôi đồng ý với nhận xét của bạn linuxdan ... Java đã đi theo con đường của khủng long về mặt cập nhật cú pháp của nó.
Kevin Parker

6
@Bozho Cách trăn làm : import [fully-qualified-name] as [ident]. Từ khóa của người dùng trên mạng có vẻ không phù hợp với Java, một từ thay thế là khoảng những gì C # sử dụng : import [ident] = [fully-qualified-name].
Daniel H

60

Như các câu trả lời khác đã nêu, Java không cung cấp tính năng này.

Việc triển khai tính năng này đã được yêu cầu nhiều lần, ví dụ như JDK-4194542: bí danh tên lớp hoặc JDK-4214789: Mở rộng nhập để cho phép đổi tên loại đã nhập .

Từ các ý kiến:

Đây không phải là một yêu cầu vô lý, mặc dù hầu như không cần thiết. Việc sử dụng thường xuyên các tên đủ điều kiện không phải là một gánh nặng quá mức (trừ khi thư viện thực sự sử dụng lại các tên đơn giản giống nhau bên phải và bên trái, đó là phong cách xấu).

Trong mọi trường hợp, nó không vượt qua mức giá / hiệu suất để thay đổi ngôn ngữ.

Vì vậy, tôi đoán rằng chúng ta sẽ không thấy tính năng này trong Java bất cứ lúc nào sớm :-P


15
ồ bạn không đùa về "không (...) bất cứ lúc nào sớm", tôi thấy rằng yêu cầu tính năng đã bị loại bỏ vô nghĩa từ năm 1998! Và mọi nỗ lực để mở lại cuộc thảo luận trong suốt 18 năm qua đã bị mắc kẹt trên một tham chiếu đến quyết định cổ xưa đó. Tôi đoán sẽ dễ dàng thuyết phục các nhà phát triển IDE thực hiện điều này như một mặt nạ trong trình soạn thảo hơn là cố gắng đưa ý nghĩa vào Oracle.
Superole

2
Lý do cũ là chính xác mặc dù - trong thực tế những cuộc đụng độ này rất hiếm khi xảy ra.
mỏng

14
Tôi không đồng ý rằng những cuộc đụng độ này hiếm khi xảy ra. Hướng đối tượng ủng hộ việc đặt tên đơn giản. Tôi có thể có một Nhân viên lớp từ hai thư viện khác nhau làm những việc riêng biệt với một nhân viên (ví dụ).
Andrei Epure

6
@slim " trong thực tế những cuộc đụng độ này rất hiếm khi xảy ra ". Nó không phải là rõ ràng với tôi lý do tại sao những tình huống sẽ xảy ra ít thường xuyên trong java (nơi bạn có thể có 10.000+ lớp) so với các ngôn ngữ khác (nơi bạn thường có các lớp học ít hơn) mà làm hỗ trợ cú pháp này "đường".
Alain Pannetier

21
Hoàn toàn không chính xác. Tôi đang đối mặt với một kịch bản rất đơn giản có lẽ rất phổ biến và ở đó đường cú pháp này sẽ cực kỳ hữu ích. Dịch giữa các mô hình đối tượng liên quan, nhưng khác biệt (được sử dụng trong các sản phẩm có liên quan nhưng khác nhau tương ứng) có các lớp hầu hết thời gian chia sẻ cùng một tên. Quá trình dịch thuật yêu cầu bạn tham khảo cả hai lớp trong cùng một khối mã. Trong trường hợp như vậy (phải rất phổ biến), Java làm cho cuộc sống rất khó khăn. Chỉ cần số lượt xem trên bài đăng này sẽ cho bạn biết câu chuyện.
hourshi1990

59

Có lẽ đáng chú ý rằng Groovy có tính năng này :

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

MyCalendar myCalendar = new MyCalendar()

15
Ở Scala, nó:import com.example.{Calendar => MyCalendar}
pottaisco

24
Và trong Kotlin : import com.example.Calendar as MyCalendar.
KevinO

14
Trong PHP, nó: sử dụng com \ example \ Lịch làm MyCalWiki
matang

19
Thật khó chịu khi thấy rằng (ít nhất) 3 ngôn ngữ dựa trên JVM (Groovy, Scala & Kotlin) có tính năng này nhưng bản thân Java vẫn không ...
Matthias

2
Một cái gì đó như thế class MyCalendar extends com.example.Calendar {}nào? Nó không lý tưởng hay đẹp đẽ, nhưng nó sẽ phục vụ hầu hết các mục đích, chẳng hạn như sự phản ánh. Bạn thậm chí có thể gửi trước nó với một bình luận nếu cần thiết, thích /* import com.example.Calendar as MyCalendar */.
Braden hay nhất

21

Java không cho phép bạn làm điều đó. Bạn sẽ cần phải tham khảo một trong các lớp bằng tên đủ điều kiện của nó và chỉ nhập tên khác.



-4

Trên thực tế có thể tạo một lối tắt để bạn có thể sử dụng các tên ngắn hơn trong mã của mình bằng cách thực hiện một cái gì đó như thế này:

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

Theo cách đó, bạn chỉ cần xác định tên dài một lần và bạn có thể có bao nhiêu lớp được đặt tên đặc biệt mà bạn muốn.

Một điều tôi thích về mẫu này là bạn có thể đặt tên lớp triển khai giống như lớp cơ sở trừu tượng và chỉ đặt nó trong một không gian tên khác. Điều đó không liên quan đến mẫu nhập / đổi tên mặc dù.


18
Đây là một giải pháp rất kém. Nó hoàn toàn không giải quyết được các thống kê, có thể yêu cầu cập nhật liên tục và không giúp đỡ với các vấn đề khử / tuần tự hóa (chẳng hạn như khử lưu huỳnh từ xml qua jaxb).
Kỹ sư phần mềm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.