ใน Python คุณสามารถทำสิ่งต่อไปนี้
from a import b as c
คุณจะทำสิ่งนี้ใน Java ได้อย่างไรเนื่องจากฉันมีการนำเข้าสองรายการที่กระทบกัน
ใน Python คุณสามารถทำสิ่งต่อไปนี้
from a import b as c
คุณจะทำสิ่งนี้ใน Java ได้อย่างไรเนื่องจากฉันมีการนำเข้าสองรายการที่กระทบกัน
คำตอบ:
ไม่มีกลไกการสร้างสมนามการนำเข้าใน Java คุณไม่สามารถอิมพอร์ตสองคลาสที่มีชื่อเดียวกันและใช้ทั้งสองคลาสโดยไม่มีเงื่อนไข
นำเข้าชั้นหนึ่งและใช้ชื่อที่ผ่านการรับรองสำหรับอีกชั้นหนึ่งเช่น
import com.text.Formatter;
private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
import [fully-qualified-name] as [ident]
หลามวิธีที่ไม่: “การเป็น” คำหลักที่ดูเหมือนจะไม่เหมาะสมใน Java เช่นเดียวกับทางเลือกที่จะอยู่ที่ประมาณสิ่งที่ C # import [ident] = [fully-qualified-name]
ใช้:
ตามคำตอบอื่น ๆ ที่ระบุไว้แล้ว Java ไม่ได้ให้คุณสมบัตินี้
การดำเนินงานของคุณลักษณะนี้ได้รับการร้องขอหลายครั้งเช่นเป็นJDK-4194542: ชื่อชั้น aliasingหรือJDK-4214789: ขยายการนำเข้าจะอนุญาตให้เปลี่ยนชื่อจากประเภทที่นำเข้า
จากความคิดเห็นที่:
นี่ไม่ใช่คำขอที่ไม่สมเหตุสมผล แต่ไม่จำเป็น การใช้ชื่อที่ผ่านการรับรองเป็นครั้งคราวไม่ได้เป็นภาระที่เกินควร (เว้นแต่ห้องสมุดจะใช้ชื่อธรรมดาที่เหมือนกันทั้งด้านขวาและด้านซ้ายซึ่งเป็นลักษณะที่ไม่ดี)
ไม่ว่าในกรณีใดจะไม่ผ่านราคา / ประสิทธิภาพสำหรับการเปลี่ยนภาษา
ดังนั้นฉันเดาว่าเราจะไม่เห็นฟีเจอร์นี้ใน Java เร็ว ๆ นี้ :-P
เป็นที่น่าสังเกตว่าGroovy มีคุณสมบัตินี้ :
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
Kotlin:
class MyCalendar extends com.example.Calendar {}
นี้ มันไม่เหมาะหรือสวย แต่ควรตอบสนองวัตถุประสงค์ส่วนใหญ่สั้นพูดสะท้อน /* import com.example.Calendar as MyCalendar */
คุณยังสามารถย่อหน้ากับความคิดเห็นในกรณีที่จำเป็นเช่น
Java ไม่อนุญาตให้คุณทำเช่นนั้น คุณจะต้องอ้างถึงหนึ่งในชั้นเรียนด้วยชื่อที่ผ่านการรับรองโดยสมบูรณ์และนำเข้าอีกชั้นหนึ่งเท่านั้น
วันนี้ฉันได้ยื่นร่าง JEP ให้กับ OpenJDK เกี่ยวกับคุณสมบัตินามแฝงนี้ ฉันหวังว่าพวกเขาจะพิจารณาอีกครั้ง
หากคุณสนใจคุณสามารถค้นหาร่าง JEP ได้ที่นี่: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7
จริงๆแล้วมันเป็นไปได้ที่จะสร้างทางลัดเพื่อให้คุณสามารถใช้ชื่อที่สั้นลงในรหัสของคุณโดยทำสิ่งนี้:
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();
}
}
ด้วยวิธีนี้คุณจะต้องระบุชื่อแบบยาวเพียงครั้งเดียวและคุณสามารถมีคลาสที่มีชื่อพิเศษจำนวนมากที่คุณต้องการ
อีกสิ่งหนึ่งที่ฉันชอบเกี่ยวกับรูปแบบนี้คือคุณสามารถตั้งชื่อคลาสการใช้งานเหมือนกับคลาสเบสพื้นฐานและวางไว้ในเนมสเปซที่แตกต่างกัน ที่ไม่เกี่ยวข้องกับรูปแบบการนำเข้า / เปลี่ยนชื่อ