2011-09-06 2 views
9

मैं एक खाली जावा एनम प्रकार बना सकता हूं, लेकिन जब मैं कुछ तरीकों को जोड़ना चाहता हूं: मुझे "वाक्यविन्यास त्रुटि" (ग्रहण में) मिलता है। मुझे इसके बारे में कोई आधिकारिक दस्तावेज नहीं मिला, इसलिए मेरा सवाल है: क्या यह असंभव है (तो यह स्पष्ट रूप से कहां उल्लेख किया गया है?) या यह सिर्फ संकलक है जो गलत है?क्या विधियों के साथ एक खाली जावा एनम प्रकार बनाना संभव है?

+0

यदि आप त्रुटि देते हैं तो कोड पोस्ट करते हैं, तो हम एक और विस्तृत उत्तर देने में सक्षम होंगे। – tb189

+3

आप एक खाली enum क्यों चाहते हैं? – maasg

+0

वह रनमटाइम पर उस एनम का एक सेट बनाना चाहता है, लेकिन अभी भी उदाहरण व्यवहार हैं। – ggb667

उत्तर

16

हाँ यह संभव है।

enum TestEnum { 
    ;       // doesn't compile without this. 
    public void hello() { 
     System.out.println("Hello World"); 
    } 
} 

JLS Syntax Definition for enums

(ध्यान दें कि जिन उदाहरणों के बिना, आप केवल के static तरीकों कॉल करने के लिए सक्षम हो जाएगा: तुम बस enum स्थिरांक की (खाली) सूची समाप्त करने के लिए एक ; जोड़ने की जरूरत enum)

संबंधित:।

+0

हैलो विधि कॉल करना असंभव होगा, है ना? मैं इस तरह के निर्माण के बिंदु को देखने में असफल रहा। –

+0

जैसा कि यह हां खड़ा है। शायद उनके तरीके 'स्थिर' हैं, मुझे नहीं पता। लेकिन हाँ, मैं आपसे सहमत हूं। यह थोड़ा अजीब लगता है। – aioobe

+3

उत्तर और लिंक के लिए धन्यवाद @aioobe। मैं ऐसा इसलिए करना चाहता हूं क्योंकि मुझे लगता है कि यह एक प्राकृतिक, और बहुत आसान/समझने योग्य तरीका है, जो एक गैर-अस्थिर वर्ग को लागू करने का तरीका है (आमतौर पर केवल स्थिरता विधियों के साथ एक उपयोगिता वर्ग): मेरे लिए यह कहना अधिक स्वाभाविक है "ए गैर-अस्थिर वर्ग कोई तत्व नहीं है "(यानी स्वयं का कोई उदाहरण उपयोग करने की अनुमति नहीं है) कहने के बजाय" इसे एक निजी कन्स्ट्रक्टर के साथ एक AssertionError फेंकने के साथ कार्यान्वित किया जाना चाहिए "(सीएफ। प्रभावी जावा # 4)। लेकिन यह केवल मेरा दृष्टिकोण है, इसलिए यदि मैं गलत हूं तो मुझे चुनौती देने में संकोच न करें ... – cedric

5

हाँ, यह है:

आप enums के खाली सूची समाप्त करने के लिए अर्धविराम (;) जोड़ने की जरूरत है।
यह संकलित:

public enum MyEnum { 
    ; 
    public void method() { 

    } 
} 

हालांकि मुझे नहीं लगता कि कर सकते हैं इसके लिए उपयोगी होगा क्या।

+1

विधियां उपयोगी हो सकती हैं, जब enums फ़ील्ड से बना होता है .. तो कहें कि आपके पास एक enum रंग है जिसमें एक int प्रतिनिधित्व, लघु स्ट्रिंग प्रतिनिधित्व के साथ-साथ एक प्रदर्शन स्ट्रिंग प्रतिनिधित्व भी है .. तो इस enum में getInteger(), getShortString(), getDisplayString() .. तो उदाहरण के लिए यह getDisplayString() विकल्प का उपयोग कर जीयूआई पर दिखाया जा सकता है ... शायद getShortString() विकल्प का उपयोग कर डीबी में संग्रहीत ... – Scorpion

+2

मुझे लगता है कि बोहेमियन का अर्थ यह है कि वह विधियों के साथ * खाली * enum के साथ उपयोगी कुछ भी नहीं सोच सकता है। – aioobe

+1

हां - इस तरह के किसी भी उदाहरण विधियों को पहुंच योग्य नहीं होगा। इसके अलावा, मैं एक खाली enum के साथ करने के लिए बहुत उपयोगी नहीं सोच सकता। – Bohemian

1

Absoulely,

/** 
* @author The Elite Gentleman 
* @since 06 September 2011 
* 
*/ 
public enum ExampleEnum { 
    WHAT_ENUM 
    ; 

    public void doOperation() { 

    } 
} 

बाद में:

ExampleEnum exEnum = ExampleEnum.WHAT_ENUM; 
exEnum.doOperation(); 
6

पाठ्यक्रम आप कर सकते हैं का! "आईए! आईए! कथुलु फाथगान! फेंग्लुई एमग्ल्वाफह कथुलु रीलह wgah'nagl fhtagn !!"

मूल विचार: "http://www.theserverside.com/news/thread.tss?thread_id=50190"

अपने जोखिम पर वास्तविकता को नष्ट।

import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.Method; 

enum ThingsThatShouldNotBe { 
; 
public void HelloWorld() { 
    System.out.println(this.name() + " Says Hello!"); 
} 
public static void main(String[] args) throws Exception { 
    Constructor<?> con = ThingsThatShouldNotBe.class.getDeclaredConstructors()[0]; 
    Method[] methods = con.getClass().getDeclaredMethods(); 
    for (Method m : methods) { 
     if (m.getName().equals("acquireConstructorAccessor")) { 
      m.setAccessible(true); 
      m.invoke(con, new Object[0]); 
     } 
    } 
    Field[] fields = con.getClass().getDeclaredFields(); 
    Object ca = null; 
    for (Field f : fields) { 
     if (f.getName().equals("constructorAccessor")) { 
      f.setAccessible(true); 
      ca = f.get(con); 
     } 
    } 
    Method m = ca.getClass().getMethod("newInstance", 
     new Class[] { Object[].class }); 
    m.setAccessible(true); 
    ThingsThatShouldNotBe v = (ThingsThatShouldNotBe) m.invoke(ca, new Object[] { new Object[] { "Cthulhu", 
      Integer.MAX_VALUE } }); 
    System.out.println(v.getClass() + ":" + v.name() + ":" + v.ordinal()); 
    System.out.println("Say hello Cthulhu!"); 
    v.HelloWorld(); 
} 
} 

Mwu HA HA HA HA HA HA।

तुम सच में एक Enum की जरूरत है और आप इसे उदाहरण के तरीकों करना चाहते हैं, और आप प्रतिबिंब के बड़े देवताओं को बुलाने के लिए दुनिया पर इस abomination मजबूर करने के लिए समाधान कर लिया है, तो यह उपयोगी है।

यह निश्चित रूप से बाद में अन्य डेवलपर्स के बाहर बिल्ली को भ्रमित कर देगा।

संबंधित मुद्दे