मैं देखा कि Java Enum Documentation राज्यों क्रमसूचक विधि:उपयोग
इस गणना स्थायी की क्रमसूचक (अपने enum घोषणा, जहां प्रारंभिक निरंतर का एक क्रमसूचक असाइन किया गया है में अपनी स्थिति रिटर्न शून्य)। अधिकांश प्रोग्रामर का इस विधि के लिए कोई उपयोग नहीं होगा। यह परिष्कृत enum- आधारित डेटा संरचनाओं, जैसे EnumSet और EnumMap द्वारा उपयोग के लिए डिज़ाइन किया गया है।
मैं ऑनलाइन सभी उदाहरण है कि एक सरणी में सूचकांक को ordinal
का उपयोग नहीं करने का सुझाव देते हैं समझते हैं, लेकिन इसके बजाय एक EnumMap
। विशेष रूप से Item 33 of Effective Java लेकिन मेरा सवाल यह है: क्या यह Enum
परिभाषा के भीतर इसका उपयोग करना ठीक है?
public enum Direction {
NORTH(0, 1), NORTH_EAST(1, 1), EAST(1, 0), SOUTH_EAST(1, -1),
SOUTH(0, -1), SOUTH_WEST(-1, 1), WEST(-1, 0), NORTH_WEST(-1, 1);
private final int xOffset;
private final int yOffset;
private final static int DEGREES = 360;
private Direction(int xOffset, int yOffset) {
this.xOffset = xOffset;
this.yOffset = yOffset;
}
public Position move(Position position) {
return new Position(position.getX() + xOffset, position.getY() + yOffset);
}
public Direction rotate(int degrees) {
int length = Direction.values().length;
int index = (ordinal() + (degrees/(DEGREES/length))) % length;
return Direction.values()[index];
}
}
आप मैं क्रमसूचक() का उपयोग कर रहा देख सकते हैं ताकि मैं दिशाओं के माध्यम से चक्र (और अगले प्रासंगिक दिशा वापसी): उदाहरण के लिए इस प्रकार के रूप में अपने कोड है। जैसे NORTH
से 9 0 डिग्री घूर्णन EAST
लौटाएगा।
हालांकि मुझे पता है कि ऑर्डिनल का उपयोग करना अच्छा अभ्यास नहीं है, इसलिए मुझे आश्चर्य हुआ कि क्या ऐसा करने का एक बेहतर तरीका है, जबकि कोड आकार को नीचे रखना और पठनीयता को बनाए रखना है।
मैं किसी भी सलाह के लिए बहुत सराहना करता हूं!
यदि आप प्रभावी जावा सावधानीपूर्वक (आइटम 31) पढ़ते हैं, तो आप देख सकते हैं कि वास्तव में यह इस तरह से क्रमिक उपयोग करने के खिलाफ सलाह दे रहा है * क्योंकि नए तत्व enum * में नहीं जोड़े जा सकते हैं। इस मामले में, एक WEST_FAR_AWAY (-10, 0) तत्व कोड तोड़ देगा। तो नहीं, जोशुआ ब्लोच इस कोड को स्वीकार नहीं करेगा, जो एक त्वरित और गंदा समाधान है। यह ठीक है (काम कर रहा है), लेकिन सबसे अच्छा नहीं है। – lbalazscs
@ibalazscs - इस मामले में एक नया 'enum' जोड़ना समझ में नहीं आता है। आपका WEST_FAR_AWAY बिल्कुल समझ में नहीं आता है। – OldCurmudgeon
मैं कई परिदृश्यों के बारे में सोच सकता हूं जहां यह समझ में आएगा। उदाहरण के लिए, चाल विधि ऑफसेट का उपयोग करती है, और एक अलग ऑफसेट के साथ एक दिशा का उपयोग किया जा सकता है जो तेजी से आगे बढ़ रहा है। या यह पता चला कि किसी कारण से SOUTH_WEST को हटाया जाना चाहिए - इससे यह नाजुक कोड भी टूट जाएगा। – lbalazscs