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.
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.
Câu trả lời:
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;
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]
.
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
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()
import com.example.{Calendar => MyCalendar}
import com.example.Calendar as MyCalendar
.
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 */
.
Hôm nay tôi đã nộp một bản nháp JEP cho OpenJDK về tính năng răng cưa này. Tôi hy vọng họ sẽ xem xét lại nó.
Nếu bạn quan tâm, bạn có thể tìm thấy bản nháp JEP tại đây: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7
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ù.