የጃቫ ጀነቲክስ ትምህርት - ጀነቲክስ ምንድን ናቸው እና እነሱን እንዴት መጠቀም እንደሚቻል?

የጃቫ ጀነቲክስ ከጃቫ ቋንቋ በጣም አስፈላጊ ከሆኑ ባህሪዎች አንዱ ነው ፡፡ ከጄኔቲክስ በስተጀርባ ያለው ሀሳብ በጣም ቀላል ነው ፣ ሆኖም ፣ ከተለመደው አገባብ ጋር በመዛወሩ አንዳንድ ጊዜ ውስብስብ ይሆናል።

የዚህ የማጠናከሪያ ትምህርት ዓላማ ይህንን ለመረዳት ጠቃሚ በሆነው የጄኔቲክስ ፅንሰ-ሀሳብ እርስዎን ለማስተዋወቅ ነው ፡፡

ግን ወደ ጀነቲክ ራሱ ከመጥለቁ በፊት በመጀመሪያ የጃቫ ጀነቲክስ ለምን እንደሚያስፈልግ እናውቅ ፡፡




የጃቫ ጀነቲክስ ዓላማ

በጃቫ 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));
} }
ዘዴ የውሻ ክፍልን እጅግ በጣም ዓይነቶችን የሚያከማቹ ዝርዝሮችን ብቻ ይቀበላል ፡፡ የአጥቢ እንስሳትን ወይም የእንስሳትን ዕቃዎች ዝርዝር ይቀበላል ግን የላብዶግ ዕቃዎች ዝርዝርን አይቀበልም ምክንያቱም ላብዶግ የውሻ እጅግ የላቀ አይደለም ፣ ግን ንዑስ ክፍል ነው ፡፡ ይህ ዝቅተኛ ወሰን ያለው የዱር ምልክት ምሳሌ ነው።



ማጠቃለያ

የጃቫ ጀነቲክስ ፕሮግራሙ ከተጀመረበት ጊዜ አንስቶ ያለ መኖር የማይችል ባህሪ ሆኗል ፡፡

ይህ ተወዳጅነት የፕሮግራም አዘጋጆችን ሕይወት ቀለል ለማድረግ በሚያደርገው ተጽዕኖ ምክንያት ነው ፡፡ የጄኔቲክ አጠቃቀም የኮድ ስህተቶችን እንዳያደርጉ ከመከልከል ውጭ ፣ ኮዱ ተደጋጋሚ እንዳይሆን ያደርገዋል ፡፡ ለተለያዩ የመረጃ አይነቶች ኮድ መደገምን ለማስወገድ ክፍሎችን እና ዘዴዎችን እንዴት አጠቃላይ እንደሚያደርግ አስተውለሃል?

በቋንቋው ባለሙያ ለመሆን የጄኔቲክስን በደንብ መገንዘብ ጠቃሚ ነው ፡፡ ስለዚህ በዚህ መማሪያ ውስጥ የተማሩትን በተግባራዊ ኮድ መተግበር አሁን ወደ ፊት ለመሄድ መንገድ ነው ፡፡