मान लीजिए आप एक API कि मूल रूप से साल पहले जारी किया गया था को बनाए रखने रहे हैं (जावा से पहले enum
समर्थन प्राप्त) है और यह ints के रूप में शुमार मूल्यों के साथ एक वर्ग को परिभाषित करता:एक एपीआई विकसित होने के रूप में जावा एनम्स के साथ "इंट एनम" पैटर्न के सह-अस्तित्व को संभालने का सबसे अच्छा तरीका क्या है?
public class VitaminType {
public static final int RETINOL = 0;
public static final int THIAMIN = 1;
public static final int RIBOFLAVIN = 2;
}
वर्षों में एपीआई विकसित किया गया है और प्राप्त जावा 5-विशिष्ट विशेषताएं (जेनरेटेड इंटरफेस, आदि)। अब आप के बारे में एक नई गणना को जोड़ने के लिए कर रहे हैं:
public enum NutrientType {
AMINO_ACID, SATURATED_FAT, UNSATURATED_FAT, CARBOHYDRATE;
}
'पुरानी शैली' पूर्णांक-enum पैटर्न कोई प्रकार सुरक्षा, व्यवहार या डेटा जोड़ने की कोई संभावना नहीं, आदि, है, लेकिन प्रकाशित होने के बाद और उपयोग में । मुझे चिंता है कि गणना की दो शैलियों को मिश्रित करना एपीआई के उपयोगकर्ताओं के लिए असंगत है।
ऊपर दो और (मेरे काल्पनिक उदाहरण में
NutrientType
) नई enum परिभाषितVitaminType
वर्ग की तरह ints की एक श्रृंखला के रूप में:मैं तीन संभावित दृष्टिकोण से देखते हैं। आप स्थिरता प्राप्त करते हैं लेकिन आप प्रकार की सुरक्षा और अन्य आधुनिक सुविधाओं का लाभ नहीं उठा रहे हैं।
एक प्रकाशित एपीआई में असंगतता साथ रहने के लिए तय:
VitaminType
रखने के रूप में है चारों ओर, और एकenum
रूपNutrientType
जोड़ें।VitaminType
लेने वाले तरीकों को अभी भी एक int लेने के रूप में घोषित किया गया है,NutrientType
लेने वाले विधियों को इस तरह के रूप में घोषित किया जाता है।VitaminType
कक्षा को अस्वीकार करें और एक नयाVitaminType2
enum प्रस्तुत करें। एक enum के रूप में नयाNutrientType
परिभाषित करें।
बधाई हो, अगले 2-3 वर्षों तक जब तक आप बहिष्कृत प्रकार को मार नहीं सकते हैं, तो आप प्रत्येक विधि के बहिष्कृत संस्करणों से निपटने जा रहे हैं, जिसनेVitaminType
को एक इंट के रूप में लिया और प्रत्येक के नएfoo(VitaminType2 v)
संस्करण को जोड़ा। आपको प्रत्येक बहिष्कृतfoo(int v)
विधि के साथ-साथ इसके संबंधितfoo(VitaminType2 v)
विधि के लिए परीक्षण लिखने की भी आवश्यकता है, इसलिए आपने अपने क्यूए प्रयास को गुणा किया है।
सबसे अच्छा तरीका क्या है?