የጃቫ ጀነቲክስ ከጃቫ ቋንቋ በጣም አስፈላጊ ከሆኑ ባህሪዎች አንዱ ነው ፡፡ ከጄኔቲክስ በስተጀርባ ያለው ሀሳብ በጣም ቀላል ነው ፣ ሆኖም ፣ ከተለመደው አገባብ ጋር በመዛወሩ አንዳንድ ጊዜ ውስብስብ ይሆናል።
የዚህ የማጠናከሪያ ትምህርት ዓላማ ይህንን ለመረዳት ጠቃሚ በሆነው የጄኔቲክስ ፅንሰ-ሀሳብ እርስዎን ለማስተዋወቅ ነው ፡፡
ግን ወደ ጀነቲክ ራሱ ከመጥለቁ በፊት በመጀመሪያ የጃቫ ጀነቲክስ ለምን እንደሚያስፈልግ እናውቅ ፡፡
በጃቫ 5 ውስጥ የዘር ውርስ ከመጀመሩ በፊት ስህተት ወይም ማስጠንቀቂያ ሳይወረውሩ እንደዚህ የመሰለ የቁረጥ ቅንጥብ መጻፍ እና ማጠናቀር ይችላሉ-
List list = new ArrayList(); list.add('hey'); list.add(new Object());
ምን ዓይነት ውሂብ እንደሚያከማች ማወጅ ሳያስፈልግ ዝርዝርን ወይም ሌላ የጃቫ ክምችት ውስጥ ማንኛውንም ዓይነት እሴቶችን ማከል ይችላሉ ፡፡ ነገር ግን እሴቶችን ከዝርዝሩ ውስጥ ሲያወጡ በግልፅ ወደ አንድ የተወሰነ ዓይነት መጣል አለብዎት ፡፡
ከላይ በተጠቀሰው ዝርዝር ውስጥ ተመዝግበው ለመሄድ ያስቡበት ፡፡
for (int i=0; i< list.size(); i++) {
String value = (String) list.get(i); //CastClassException when i=1 }
እኛ እንዳደረግነው መጀመሪያ የተከማቸውን የመረጃ አይነት ሳናሳውቅ ዝርዝር እንዲፈጠር መፍቀድ የፕሮግራም አዘጋጆች ከዚህ በላይ ያሉትን ጥለው ስህተቶች እንዲፈጠሩ ሊያደርግ ይችላል ClassCastExceptions
በስራ ሰዓት ውስጥ.
የፕሮግራም አዘጋጆቹ እንደዚህ አይነት ስህተቶች እንዳይሰሩ ለመከላከል ጀነቲክስ ተዋወቀ ፡፡
በጄኔቲክስ የሚከተለው ምሳሌ እንደሚያሳየው የጃቫ ክምችት ሲፈጥሩ የሚከማቸውን የውሂብ አይነት በግልፅ ማወጅ ይችላሉ ፡፡
List stringList = new ArrayList();
አሁን የማጠናቀር-ጊዜ ስህተትን ሳይወረውሩ በተቆጣጣሪ ዓይነት ዝርዝር ውስጥ አንድ ኢንቲጀርትን በስህተት ማከማቸት አይችሉም። ይህ መርሃግብርዎ በስራ ሰዓት ስህተቶች ውስጥ እንደማይገባ ያረጋግጣል።
stringList.add(new Integer(4)); //Compile time Error
የጄኔቲክስ ወደ ጃቫ የተዋወቀበት ዋና ዓላማ ወደ | _ + + | | ላለመግባት ነበር በሚሠራበት ጊዜ.
የጃቫ ክፍሎችን እና ዘዴዎችን ለመፍጠር ዘረመልን መጠቀም ይችላሉ ፡፡ የእያንዳንዱን ዝርያ ጀነቲክስ እንዴት መፍጠር እንደሚችሉ ምሳሌዎችን እንመልከት ፡፡
አጠቃላይ ክፍል በሚፈጥሩበት ጊዜ ለክፍሉ ዓይነት ግቤት በክፍል ስም መጨረሻ ላይ በማዕዘን ውስጥ ይታከላል ClassCastExceptions
ቅንፎች.
እዚህ ፣ public class GenericClass {
የውሂብ አይነት መለኪያ ነው።
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return this.item;
} } T
, T
, እና N
በጃቫ ስብሰባዎች መሠረት ለመረጃ ዓይነት መለኪያዎች ጥቅም ላይ የዋሉ አንዳንድ ፊደላት ናቸው ፡፡
ከላይ ባለው ምሳሌ ውስጥ የጄነሪክ ክላስ ነገር ሲፈጥሩ አንድ የተወሰነ የውሂብ አይነት ሊያልፉት ይችላሉ።
E
አጠቃላይ የክፍል ነገር በሚፈጥሩበት ጊዜ የጥንታዊ የውሂብ አይነትን ወደ የውሂብ አይነት ግቤት ማለፍ አይችሉም ፡፡ የነገር ዓይነቶችን የሚያራዝሙ የውሂብ ዓይነቶች ብቻ እንደ ዓይነት መለኪያዎች ሊተላለፉ ይችላሉ።
ለምሳሌ:
public static void main(String[] args) {
GenericClass gc1 = new GenericClass();
gc1.setItem('hello');
String item1 = gc1.getItem(); // 'hello'
gc1.setItem(new Object()); //Error
GenericClass gc2 = new GenericClass();
gc2.setItem(new Integer(1));
Integer item2 = gc2.getItem(); // 1
gc2.setItem('hello'); //Error }
አጠቃላይ ዘዴዎችን መፍጠር አጠቃላይ ክፍሎችን ለመፍጠር ተመሳሳይ ዘይቤን ይከተላል። በአጠቃላይ ክፍል ውስጥ አጠቃላይ ያልሆነ ዘዴን እንዲሁም አጠቃላይ ያልሆነን ተግባራዊ ማድረግ ይችላሉ።
GenericClass gc3 = new GenericClass(); //Error
እዚህ ዘዴውን ለመለካት የአንድ የተወሰነ ዓይነት ድርድርን ማለፍ ይችላሉ። አጠቃላይ ዘዴ public class GenericMethodClass {
በተላለፈው ድርድር ውስጥ ይደጋገማል እና ልክ እንደ ተለመደው የጃቫ ዘዴ የተከማቸውን ዕቃዎች ያትማል።
public static void printItems(T[] arr){
for (int i=0; i< arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
String[] arr1 = {'Cat', 'Dog', 'Mouse'};
Integer[] arr2 = {1, 2, 3};
GenericMethodClass.printItems(arr1); // 'Cat', 'Dog', 'Mouse'
GenericMethodClass.printItems(arr2); // 1, 2, 3
} }
እስካሁን ድረስ ከላይ የፈጠርናቸው አጠቃላይ ትምህርቶች እና ዘዴዎች ከጥንት ዓይነቶች በስተቀር ለሌላ ማንኛውም የውሂብ ዓይነት ልኬት ሊሆኑ ይችላሉ ፡፡ ግን ወደ ጄኔቲክ ሊተላለፉ የሚችሉትን የውሂብ አይነቶችን መገደብ ብንፈልግስ? የታሰረ ዓይነት መለኪያዎች የሚገቡበት ቦታ ነው ፡፡
የሌላ የውሂብ ዓይነት ንዑስ ክፍል መሆን እንዳለበት በመጥቀስ በአንድ አጠቃላይ ክፍል ወይም ዘዴ የተቀበሉትን የውሂብ አይነቶች ማሰር ይችላሉ።
ለምሳሌ:
PrintItems()
እዚህ | //accepts only subclasses of List public class UpperBoundedClass{
እና
//accepts only subclasses of List
public void UpperBoundedMethod(T[] arr) {
} } UpperBoundedClass
ሊለካ የሚችለው የ UpperBoundedMethod
ንዑስ ዓይነቶችን በመጠቀም ብቻ ነው የውሂብ አይነት.
List
የውሂብ አይነት እንደየአይነቱ ግቤት እንደ የላይኛው ወሰን ይሠራል። የ List
ንዑስ አይነት ያልሆነ የውሂብ አይነት ለመጠቀም ከሞከሩ የማጠናቀር ጊዜ ስህተት ይጥላል።
ወሰኖቹ በክፍሎች ብቻ የተገደቡ አይደሉም። እንዲሁም በይነገጾችን ማለፍ ይችላሉ ፡፡ በይነገጹን ማራዘም ማለት በዚህ ሁኔታ በይነገጽን መተግበር ማለት ነው ፡፡
አንድ ልኬት እንዲሁ እንደ ምሳሌ ያሳያል ብዙ ወሰን ሊኖረው ይችላል።
List
የመቀበያው የውሂብ አይነት የሁለቱም የእንስሳት እና የአጥቢ እንስሳት ንዑስ ክፍል መሆን አለበት። ከነዚህ ወሰኖች ውስጥ አንዱ ክፍል ከሆነ ፣ በተያዘው መግለጫ ውስጥ መጀመሪያ ሊመጣ ይገባል ፡፡
ከላይ በምሳሌው ላይ ፣ አጥቢው ክፍል ከሆነ እና እንስሳ በይነገጽ ከሆነ አጥቢ እንስሳ ከላይ እንደተመለከተው መጀመሪያ መምጣት አለበት ፡፡ አለበለዚያ ኮዱ የማጠናቀር-ጊዜ ስህተት ይጥላል።
የዱር ካርዶች የዘመናዊ ዓይነቶችን መለኪያዎች ወደ ዘዴዎች ለማስተላለፍ ያገለግላሉ ፡፡ ከዚህ በተለየ መልኩ አጠቃላይ ዘዴ ፣ እዚህ ላይ ፣ አጠቃላይ ልኬቱ በዘዴ ለተቀበሉት መለኪያዎች ይተላለፋል ፣ ይህም ከላይ ከተነጋገርነው የውሂብ አይነት ልኬት የተለየ ነው። የዱር ምልክት በ ይወከላል? ምልክት
//accepts only subclasses of both Mammal and Animal public class MultipleBoundedClass{
//accepts only subclasses of both Mammal and Animal
public void MultipleBoundedMethod(T[] arr){
} }
ከላይ public void printItems(List list) {
ዘዴው የማንኛውንም የመረጃ አይነት ዝርዝሮችን እንደ መለኪያ ይቀበላል። ይህ የፕሮግራም አዘጋጆች ለተለያዩ የውሂብ ዓይነቶች ዝርዝር ኮዶችን እንዳይደገሙ ያግዳቸዋል ፣ ይህም ያለ ጄኔቲክስ ሁኔታ ይሆናል ፡፡
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }
ዘዴው በተቀበለው ዝርዝር ውስጥ የተከማቸውን የውሂብ አይነቶችን መገደብ ከፈለግን የታሰሩ የዱር ካርዶችን መጠቀም እንችላለን ፡፡
ለምሳሌ:
printItems()
public void printSubTypes(List list) {
ዘዴ የሚቀበለው የቀለም ንዑስ ዓይነቶችን የሚያከማቹ ዝርዝሮችን ብቻ ነው ፡፡ የሬድኮለር ወይም የብሉካሎር እቃዎችን ዝርዝር ይቀበላል ፣ ነገር ግን የእንስሳት እቃዎችን ዝርዝር አይቀበልም። ይህ የሆነበት ምክንያት እንስሳ የቀለም ንዑስ ዓይነት ስላልሆነ ነው ፡፡ ይህ የላይኛው ወሰን ያለው የዱር ምልክት ምሳሌ ነው።
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }
በተመሳሳይ እኛም ቢሆን ኖሮ
printSubTypes()
ከዚያ | public void printSuperTypes(List list) {
ዘዴ የውሻ ክፍልን እጅግ በጣም ዓይነቶችን የሚያከማቹ ዝርዝሮችን ብቻ ይቀበላል ፡፡ የአጥቢ እንስሳትን ወይም የእንስሳትን ዕቃዎች ዝርዝር ይቀበላል ግን የላብዶግ ዕቃዎች ዝርዝርን አይቀበልም ምክንያቱም ላብዶግ የውሻ እጅግ የላቀ አይደለም ፣ ግን ንዑስ ክፍል ነው ፡፡ ይህ ዝቅተኛ ወሰን ያለው የዱር ምልክት ምሳሌ ነው።
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }
የጃቫ ጀነቲክስ ፕሮግራሙ ከተጀመረበት ጊዜ አንስቶ ያለ መኖር የማይችል ባህሪ ሆኗል ፡፡
ይህ ተወዳጅነት የፕሮግራም አዘጋጆችን ሕይወት ቀለል ለማድረግ በሚያደርገው ተጽዕኖ ምክንያት ነው ፡፡ የጄኔቲክ አጠቃቀም የኮድ ስህተቶችን እንዳያደርጉ ከመከልከል ውጭ ፣ ኮዱ ተደጋጋሚ እንዳይሆን ያደርገዋል ፡፡ ለተለያዩ የመረጃ አይነቶች ኮድ መደገምን ለማስወገድ ክፍሎችን እና ዘዴዎችን እንዴት አጠቃላይ እንደሚያደርግ አስተውለሃል?
በቋንቋው ባለሙያ ለመሆን የጄኔቲክስን በደንብ መገንዘብ ጠቃሚ ነው ፡፡ ስለዚህ በዚህ መማሪያ ውስጥ የተማሩትን በተግባራዊ ኮድ መተግበር አሁን ወደ ፊት ለመሄድ መንገድ ነው ፡፡