जवाबों:
हाँ, आप एक नेस्टेड क्लास या इनर क्लास दोनों को एक जावा इंटरफेस के अंदर बना सकते हैं (ध्यान दें कि लोकप्रिय धारणा के विपरीत " स्टैटिक इनर क्लास " जैसी कोई चीज नहीं है : यह बस कोई मतलब नहीं है, "आंतरिक" और नहीं "कुछ भी नहीं है" जब नेस्टेड क्लास स्थिर होता है, तो "क्लास", इसलिए यह "स्टैटिक इनर" नहीं हो सकता है)।
वैसे भी, निम्नलिखित संकलन ठीक है:
public interface A {
class B {
}
}
मैंने देखा है कि इसे सीधे इंटरफ़ेस डेफिनिशन में किसी तरह का "कॉन्ट्रैक्ट चेकर" लगाने के लिए इस्तेमाल किया जाता है (अच्छी तरह से, इंटरफ़ेस में नेस्टेड क्लास में, जो स्टैटिक तरीके हो सकते हैं, इसके विपरीत इंटरफेस ही है, जो नहीं हो सकता है)। इस तरह से देख रहा हूँ अगर मुझे सही से याद है।
public interface A {
static class B {
public static boolean verifyState( A a ) {
return (true if object implementing class A looks to be in a valid state)
}
}
}
ध्यान दें कि मैं ऐसी किसी चीज की उपयोगिता पर टिप्पणी नहीं कर रहा हूं, मैं बस आपके प्रश्न का उत्तर दे रहा हूं: यह किया जा सकता है और यह एक तरह का उपयोग है जो मैंने इसे बनाया है।
अब मैं इस तरह के एक निर्माण की उपयोगिता पर टिप्पणी नहीं करूंगा और मैंने देखा है: मैंने इसे देखा है, लेकिन यह बहुत सामान्य निर्माण नहीं है।
200KLOC कोडबेस यहां होता है जहां यह बिल्कुल शून्य समय होता है (लेकिन तब हमें बहुत सी अन्य चीजें मिली हैं जो हम बुरे व्यवहारों पर विचार करते हैं जो बिल्कुल शून्य समय भी होता है कि अन्य लोग पूरी तरह से सामान्य पाएंगे ...)।
interface
सकते । आप एक 's नेस्टेड वर्ग के संशोधक को छोड़ सकते हैं लेकिन फिर भी, यह एक नेस्टेड वर्ग है, आंतरिक वर्ग नहीं। static
interface
B
क्लास एक स्टैटिक नेस्टेड क्लास है, न कि इनर क्लास; इंटरफेस को विशेष उपचार मिलता है। मैं इस ऑनलाइन का उल्लेख नहीं पा रहा था, केवल कल्पना के अलावा: "एक इंटरफ़ेस का एक सदस्य वर्ग अंतर्निहित रूप से स्थिर है इसलिए इसे कभी भी आंतरिक वर्ग नहीं माना जाता है।" docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3
हां, हमारे पास इंटरफेस के अंदर कक्षाएं हो सकती हैं। उपयोग का एक उदाहरण हो सकता है
public interface Input
{
public static class KeyEvent {
public static final int KEY_DOWN = 0;
public static final int KEY_UP = 1;
public int type;
public int keyCode;
public char keyChar;
}
public static class TouchEvent {
public static final int TOUCH_DOWN = 0;
public static final int TOUCH_UP = 1;
public static final int TOUCH_DRAGGED = 2;
public int type;
public int x, y;
public int pointer;
}
public boolean isKeyPressed(int keyCode);
public boolean isTouchDown(int pointer);
public int getTouchX(int pointer);
public int getTouchY(int pointer);
public float getAccelX();
public float getAccelY();
public float getAccelZ();
public List<KeyEvent> getKeyEvents();
public List<TouchEvent> getTouchEvents();
}
यहां कोड में दो नेस्टेड क्लासेस हैं जो इवेंट ऑब्जेक्ट्स के बारे में जानकारी एनकैप्सुलेट करने के लिए हैं जो बाद में getKeyEvents () जैसी विधि परिभाषाओं में उपयोग किए जाते हैं। उन्हें इनपुट इंटरफ़ेस के अंदर रखने से सामंजस्य में सुधार होता है।
एक मान्य उपयोग, IMHO, ऑब्जेक्ट्स को परिभाषित कर रहा है जो कि प्राप्त कर रहे हैं या संलग्न इंटरफ़ेस विधियों द्वारा लौटाए गए हैं। युक्तिपूर्वक डेटा होल्डिंग संरचनाएँ। इस तरह, यदि ऑब्जेक्ट केवल उस इंटरफ़ेस के लिए उपयोग किया जाता है, तो आपके पास चीजें अधिक सामंजस्यपूर्ण तरीके से होती हैं।
उदाहरण द्वारा:
interface UserChecker {
Ticket validateUser(Credentials credentials);
class Credentials {
// user and password
}
class Ticket {
// some obscure implementation
}
}
लेकिन वैसे भी ... यह केवल स्वाद की बात है।
जावा 7 युक्ति से उद्धरण :
इंटरफेस में सदस्य प्रकार की घोषणाएं हो सकती हैं ()8.5)।
एक इंटरफ़ेस में एक सदस्य प्रकार की घोषणा स्पष्ट रूप से स्थिर और सार्वजनिक है। इसे इन दोनों संशोधक में से किसी को या तो निर्दिष्ट करने की अनुमति है।
जावा इंटरफेस के अंदर गैर-स्थिर कक्षाओं की घोषणा करना संभव नहीं है, जो मुझे समझ में आता है।
एक दिलचस्प उपयोग का मामला एक आंतरिक वर्ग के माध्यम से एक डिफ़ॉल्ट कार्यान्वयन के प्रकार प्रदान करने के लिए है जैसा कि यहां बताया गया है: https://stackoverflow.com/a/3442218/454667 (एकल-वर्ग-विरासत की समस्या को दूर करने के लिए)।
यह निश्चित रूप से संभव है, और एक मामला जहां मैंने इसे उपयोगी पाया है, जब एक इंटरफ़ेस को कस्टम अपवाद फेंकना पड़ता है। आप उनके संबंधित इंटरफ़ेस के साथ अपवाद रखते हैं, जो मुझे लगता है कि अक्सर आपके स्रोत के पेड़ को तुच्छ अपवाद फ़ाइलों के ढेर के साथ बंद करने की तुलना में शून्य है।
interface MyInterface {
public static class MyInterfaceException extends Exception {
}
void doSomething() throws MyInterfaceException;
}
हाँ, एक इंटरफ़ेस के अंदर स्थिर वर्ग की परिभाषाएँ होना संभव है, लेकिन शायद इस सुविधा का सबसे उपयोगी पहलू यह है कि एनम प्रकार (जो विशेष प्रकार के स्थिर वर्ग हैं) का उपयोग करते समय। उदाहरण के लिए आप कुछ इस तरह से हो सकते हैं:
public interface User {
public enum Role {
ADMIN("administrator"),
EDITOR("editor"),
VANILLA("regular user");
private String description;
private Role(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
public String getName();
public void setName(String name);
public Role getRole();
public void setRole(Role role);
...
}
क्या @ बाची उल्लेख स्काला में लक्षण के समान है और वास्तव में एक इंटरफ़ेस के अंदर एक नेस्टेड वर्ग का उपयोग करके कार्यान्वित किया जाता है। यह जावा में सिम्युलेटेड हो सकता है। जावा लक्षण या मिश्रण पैटर्न भी देखें ?
शायद जब आप कुछ अलग कार्यान्वयन व्यवहार जैसे अधिक जटिल निर्माण चाहते हैं, तो विचार करें:
public interface A {
public void foo();
public static class B implements A {
@Override
public void foo() {
System.out.println("B foo");
}
}
}
यह आपका इंटरफ़ेस है और यह कार्यान्वयनकर्ता होगा:
public class C implements A {
@Override
public void foo() {
A.B b = new A.B();
b.foo();
}
public static void main(String[] strings) {
C c = new C();
c.foo();
}
}
कुछ स्थिर कार्यान्वयन प्रदान कर सकते हैं, लेकिन यह भ्रामक नहीं होगा, मुझे नहीं पता।
मुझे इस प्रकार के निर्माण के लिए एक उपयोग प्राथमिकी मिली।
आपके पास सभी स्थिरांक तक पहुंच है; वर्ग का नाम इस मामले में एक नाम स्थान के रूप में कार्य करता है।
मुझे अभी एक की जरूरत है। मेरे पास एक इंटरफ़ेस है जहां यह कई तरीकों में से एक अद्वितीय वर्ग को वापस करने के लिए सुविधाजनक होगा। यह वर्ग केवल इस इंटरफ़ेस के तरीकों से प्रतिक्रियाओं के लिए एक कंटेनर के रूप में समझ में आता है।
इसलिए, एक स्थिर नेस्टेड क्लास परिभाषा होना सुविधाजनक होगा, जो केवल इस इंटरफ़ेस के साथ जुड़ा हुआ है, क्योंकि यह इंटरफ़ेस एकमात्र स्थान होना चाहिए जहां यह परिणाम कंटेनर वर्ग कभी भी बनाया जाता है।