जावा में आयात का नाम बदलें, या एक ही नाम के साथ दो वर्गों का आयात करें


363

अजगर में आप एक कर सकते हैं:

from a import b as c

आप जावा में यह कैसे करेंगे, क्योंकि मेरे पास दो आयात हैं जो टकरा रहे हैं।


19
काश जावा ने ऐसा किया होता। कक्षाओं w / अजीब नामों की ओर जाता है।
fncomp

2
@fncomp: .. और पूरी तरह से योग्य
क्लासनेम के

2
Java 12 में अभी भी यह नहीं है
Janac Meena

जवाबों:


463

जावा में कोई आयात अलियासिंग तंत्र नहीं है। आप एक ही नाम से दो वर्गों का आयात नहीं कर सकते हैं और दोनों को अयोग्य घोषित कर सकते हैं।

एक वर्ग को आयात करें और दूसरे के लिए पूरी तरह से योग्य नाम का उपयोग करें, अर्थात

import com.text.Formatter;

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

16
यह सही उत्तर है और इसमें मैं केवल वही जोड़ूंगा जो आपने निहित किया है: नहीं, जावा में ऐसा कोई अन्य उपवाक्य वाक्य नहीं है।
सीन ओवेन

19
यह अभी भी जावा 8 में एक सीमा है?
HairOfTheDog

8
@HairOfTheDog नहींं, दुर्भाग्य से कोई आयात aliasing Java8 में जोड़ा गया है
AdrieanKhisbe

12
हाँ, मैं आपकी टिप्पणी के साथ सहमत हूँ linuxdan ... जावा अपने सिंटैक्स के अपडेट के मामले में डायनासोर के रास्ते पर चला गया है।
केविन पार्कर

6
@Bozho जिस तरह से अजगर करता है import [fully-qualified-name] as [ident]:। "जैसा" कीवर्ड जावा में भी फिट नहीं लगता है, एक विकल्प लगभग है जो सी # का उपयोग करता है import [ident] = [fully-qualified-name]:।
डेनियल एच

60

जैसा कि पहले ही बताए गए अन्य उत्तर हैं, जावा यह सुविधा प्रदान नहीं करता है।

इस सुविधा के कार्यान्वयन के लिए कई बार अनुरोध किया गया है, उदाहरण के लिए JDK-4194542: वर्ग नाम अलियासिंग या JDK-4214789: आयातित प्रकार का नाम बदलने के लिए आयात बढ़ाएँ

टिप्पणियों से:

यह एक अनुचित अनुरोध नहीं है, हालांकि शायद ही आवश्यक है। पूरी तरह से योग्य नामों का सामयिक उपयोग एक अनुचित बोझ नहीं है (जब तक कि पुस्तकालय वास्तव में सही और बाएं समान सरल नामों का पुन: उपयोग नहीं करता है, जो कि खराब शैली है)।

किसी भी घटना में, यह भाषा परिवर्तन के लिए मूल्य / प्रदर्शन के बार को पारित नहीं करता है।

इसलिए मुझे लगता है कि हम जल्द ही जावा में इस सुविधा को नहीं देखेंगे: -पी


15
वाह! आप "नहीं (...) कभी भी" के बारे में मजाक नहीं कर रहे थे, मैं देख रहा हूं कि 1998 के बाद फीचर फ़ीचर को बेकार चीनी के रूप में खारिज कर दिया गया था! और इन पिछले 18 वर्षों के दौरान चर्चा को फिर से खोलने का हर प्रयास उस प्राचीन निर्णय के संदर्भ में फंसा हुआ है। मुझे लगता है कि आईडीई-डेवलपर्स को इसे संपादक में मास्क के रूप में लागू करना आसान होगा, ताकि ओरेकल में समझ में आने की कोशिश की जा सके।
सुपर

2
पुराना तर्क सही है - व्यवहार में ये झड़प बहुत कम ही होती हैं।
स्लिम

14
मैं सहमत नहीं हूं कि ये झड़पें शायद ही कभी होती हैं। ऑब्जेक्ट ओरिएंटेशन सरल नामकरण का पक्षधर है। मेरे पास दो अलग-अलग पुस्तकालयों से एक कर्मचारी वर्ग हो सकता है जो एक कर्मचारी के साथ अलग चीजें करते हैं (उदाहरण के लिए)।
आंद्रेई एप्योर

6
@slim " व्यवहार में ये झड़प बहुत कम ही होती है "। यह मेरे लिए स्पष्ट नहीं है क्यों इन स्थितियों अन्य भाषाओं (जहां आम तौर पर कम श्रेणियां होती हैं), जिसमें से जावा में कम बार घटित होता (आप 10.000+ कक्षाएं हो सकता है जहां) कर इस "चीनी" वाक्य रचना समर्थन करते हैं।
एलेन पैनेटियर

21
बिलकुल गलत। मैं एक बहुत ही सरल परिदृश्य का सामना कर रहा हूं जो कि शायद बहुत ही सामान्य है और जहां यह कृत्रिम शर्करा अत्यंत उपयोगी होगा। संबंधित, लेकिन अलग-अलग ऑब्जेक्ट मॉडल (क्रमशः संबंधित लेकिन अलग-अलग उत्पादों में प्रयुक्त) के बीच अनुवाद, जिनकी कक्षाएं अधिकांश समय एक ही नाम साझा करती हैं। अनुवाद प्रक्रिया के लिए आपको एक ही कोड ब्लॉक में दोनों वर्गों को संदर्भित करना होगा। ऐसे मामले में (जो बहुत सामान्य होना चाहिए), जावा जीवन को बहुत कठिन बनाता है। बस इस पोस्ट पर विचारों की संख्या आपको कहानी को बताना चाहिए।
hrshi1990

59

यह शायद ध्यान देने योग्य है कि ग्रूवी में यह सुविधा है :

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

MyCalendar myCalendar = new MyCalendar()

15
स्काला में यह है:import com.example.{Calendar => MyCalendar}
pablisco

24
और कोटलिन में import com.example.Calendar as MyCalendar:।
केविनो

14
PHP में यह है: MyCalendar के रूप में com \ example \ Calendar का उपयोग करें
matang

19
यह देखने के लिए काफी कष्टप्रद है कि (कम से कम) 3 JVM- आधारित भाषाओं (Groovy, Scala & Kotlin) में यह सुविधा है, लेकिन जावा स्वयं अभी भी नहीं है ...
Matthias

2
क्या कुछ पसंद है class MyCalendar extends com.example.Calendar {}? यह आदर्श या सुंदर नहीं है, लेकिन यह अधिकतर उद्देश्यों को पूरा करना चाहिए, जैसे कि, प्रतिबिंब। यदि आवश्यक हो, तो आप इसे टिप्पणी के साथ भी प्रस्तुत कर सकते हैं /* import com.example.Calendar as MyCalendar */
ब्रैडेन बेस्ट

21

जावा आपको ऐसा करने की अनुमति नहीं देता है। आपको कक्षाओं में से एक को इसके पूरी तरह से योग्य नाम से संदर्भित करना होगा और केवल दूसरे को आयात करना होगा।


8

आज मैंने इस अलियासिंग फीचर के बारे में OpenJDK में एक JEP ड्राफ्ट दायर किया। मुझे उम्मीद है कि वे इस पर पुनर्विचार करेंगे।

यदि आप रुचि रखते हैं, तो आप यहां एक JEP ड्राफ्ट पा सकते हैं: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7


-4

वास्तव में एक शॉर्टकट बनाना संभव है, ताकि आप कुछ ऐसा करके अपने कोड में छोटे नामों का उपयोग कर सकें:

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

इस तरह से आपको केवल एक बार लंबे नाम को निर्दिष्ट करने की आवश्यकता है, और आपके पास कई विशेष रूप से नामित कक्षाएं हो सकती हैं जो आप चाहते हैं।

इस पैटर्न के बारे में एक और बात मुझे अच्छी लगती है कि आप इसे लागू करने वाले वर्ग को सार आधार वर्ग के रूप में नाम दे सकते हैं, और बस इसे एक अलग नामस्थान में रख सकते हैं। यह हालांकि आयात / नाम बदलने के पैटर्न से संबंधित नहीं है।


18
यह बहुत ही घटिया उपाय है। यह स्टैटिक्स से निपटने में पूरी तरह से विफल हो जाता है, लगातार अपडेट की आवश्यकता हो सकती है, और डे / सीरियललाइज़ेशन समस्याओं (जैसे कि जेएक्सबी से एक्सएमएल से deserialising) में मदद नहीं करता है।
सॉफ्टवेयर इंजीनियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.