JavaRush /Java Blog /Random-TK /Java-da umumylyklar näme

Java-da umumylyklar näme

Toparda çap edildi
Salam! Bu gün generika hakda gürleşeris. Köp täze zatlar öwrenersiň diýmeli! Diňe bu däl, indiki birnäçe leksiýa hem generiklere bagyşlanar. Java-da umumylyklar näme - 1 Şonuň üçin bu mowzuk size gyzykly bolsa, bagtly bolarsyňyz: bu gün generikleriň aýratynlyklary barada köp zat öwrenersiňiz. Bolmasa, köşeş we dynç al! :) Bu gaty möhüm mowzuk we muny bilmeli. Simpleönekeýje söz bilen başlalyň: “näme” we “näme üçin”. Generika näme? Generikler parametrli görnüşlerdir. Umumy döredilende, diňe bir onuň görnüşini däl, eýsem onuň bilen işlemeli maglumatlaryň görnüşini hem görkezýärsiňiz. Iň aýdyň mysal eýýäm kelläňize geldi diýip pikir edýärin - bu ArrayList! Adatça programmada nädip döredýändigimiz:
import java.util.ArrayList;
import java.util.List;

public class Main {

   public static void main(String[] args) {

       List<String> myList1 = new ArrayList<>();
       myList1.add("Test String 1");
       myList1.add("Test String 2");
   }
}
Siziň çak edişiňiz ýaly, sanawyň aýratynlygy, hemme zady “doldurmak” mümkin bolmazlygy: diňe obýektler bilen işleýär String. Indi Java-yň taryhyna gysga gezelenç edeliň we “näme üçin?” Diýen soraga jogap bermäge synanyşalyň. Munuň üçin “ArrayList” synpynyň ýönekeýleşdirilen görnüşini özümiz ýazarys. Sanawymyz diňe içerki massiwde maglumatlary goşup we bu maglumatlary alyp biler:
public class MyListClass {

   private Object[] data;
   private int count;

   public MyListClass() {
       this.data = new Object[10];
       this.count = 0;
   }

   public void add(Object o) {
       this.data[count] = o;
       count++;
   }

   public Object[] getData() {
       return data;
   }
}
Sanawymyzda diňe sanlaryň saklanmagyny isleýäris diýeliň Integer. Bizde umumylyk ýok. IntegerBarlag o mysalyny aç-açan görkezip bilmeris add(). Şonda tutuş synpymyz diňe amatly bolar Integerwe dünýäde bar bolan maglumatlar görnüşleri üçin bir synp ýazmaly bolarys! Programmistlerimize bil baglamagy we gereksiz zat goşmazlygy üçin kodda teswir ýazmagy karar edýäris:
//use it ONLY with Integer data type
public void add(Object o) {
   this.data[count] = o;
   count++;
}
Programmistleriň biri bu teswiri sypdyrdy we bilgeşleýin setirler bilen garylan sanlary sanawda goýmaga, soň bolsa olaryň jemini hasaplamaga synanyşdy:
public class Main {

   public static void main(String[] args) {

       MyListClass list = new MyListClass();
       list.add(100);
       list.add(200);
       list.add("Lolkek");
       list.add("Shalala");

       Integer sum1 = (Integer) list.getData()[0] + (Integer) list.getData()[1];
       System.out.println(sum1);

       Integer sum2 = (Integer) list.getData()[2] + (Integer) list.getData()[3];
       System.out.println(sum2);
   }
}
Konsol çykyşy: 300 "esasy" sapakdaky kadadan çykma java.lang.ClassCastException: java.lang.String java.lang.Integer-de Main.main-de (Main.java:14) Bu ýagdaýda iň erbet zat näme? Programmistiň biperwaýlygyndan uzak. Iň erbet tarapy, nädogry kod programmamyzda möhüm bir ýere gelip, üstünlikli düzüldi . Indi ýalňyşlygy kodlaşdyrma tapgyrynda däl-de, diňe synag döwründe göreris (we bu iň oňat ýagdaýda!). Ösüşde näsazlyklary düzetmek has köp çykdajy edýär - pul we wagt. Generikleriň takyk artykmaçlygy: umumy synp şowsuz programmistiň ýalňyşlygy derrew tapmagyna mümkinçilik döreder. Kod düzülmez!
import java.util.ArrayList;
import java.util.List;

public class Main {

   public static void main(String[] args) {

       List<Integer> myList1 = new ArrayList<>();

       myList1.add(100);
       myList1.add(100);
       myList1.add("Lolkek");//error!
       myList1.add("Shalala");//error!
   }
}
Programmist derrew “özüne geler” we derrew özüni düzeder. List.Eri gelende aýtsak, bu hili ýalňyşlygy görmek üçin öz synpymyzy döretmeli däldik . <Integer>Adaty ArrayList-den () görnüşli ýaýlary aýyryň !
import java.util.ArrayList;
import java.util.List;

public class Main {

   public static void main(String[] args) {

      List list = new ArrayList();

      list.add(100);
      list.add(200);
      list.add("Lolkek");
      list.add("Shalala");

       System.out.println((Integer) list.get(0) + (Integer) list.get(1));
       System.out.println((Integer) list.get(2) + (Integer) list.get(3));
   }
}
Konsol çykyşy: 300 "esasy" sapakdaky kadadan çykma java.lang.ClassCastException: java.lang.String, java.lang.Integer Main.main (Main.java:16) , ýagny "ýerli" gurallary ulanmak bilen Java, bu ýalňyşlygy edip, howply kolleksiýa döredip bilersiňiz. Şeýle-de bolsa, bu kody IDEa-a goýsak, duýduryş göreris: “ java.util.List çig görnüşiniň agzasy hökmünde (E) goşmak üçin barlanmadyk jaň ” Bu, elemente element goşanyňyzda bir zadyň nädogry bolup biljekdigini aýdýar. umumy däl kolleksiýa beýle däl. “Öne“ çig görnüş ”jümlesi nämäni aňladýar? Göçme manyda terjime gaty takyk bolar - “ çig görnüş ” ýa-da “ hapa görnüş ”. Raw typegörnüşi aýrylan umumy synpdyr. Başgaça aýdylanda, List myList1bu Raw type. Munuň tersine , görnüşi spesifikasiýasy bilen dogry döredilen umumy raw typesynp generic type(synp hökmünde hem tanalýar ). parameterized typeMysal üçin , List<String> myList1. Soragyňyz bolup biler: näme üçin hatda ulanmaga rugsat berilýär raw types? Sebäbi ýönekeý. raw types“Java” döredijileri utgaşyklyk problemalaryny döretmezlik üçin dilde goldaw galdyrdylar . Java 5.0 çykanda (generikler bu wersiýada ilkinji gezek peýda boldy), eýýäm köp kod ulanylyp ýazylypdy raw types. Şonuň üçin bu mümkinçilik häzirem bar. Joşua Bloçyň “Effektiv Java” atly nusgawy kitabyny leksiýalarda eýýäm birnäçe gezek ýatladyk. raw typesDili döredenleriň biri hökmünde ulanmak we kitapda mowzuk açmady generic types. Java-da umumylyklar näme - 2Bu kitabyň 23-nji bölüminde gaty sözli bir at bar: “Çig görnüşleri täze kodda ulanmaň.” Bu ýadyňyzda bolmaly. Umumy sapaklary ulananyňyzda, olary hiç haçan generic typeöwürmäň raw type.

Görkezilen usullar

Java, umumy usullar diýlip atlandyrylýan aýratyn usullary ýazmaga mümkinçilik berýär. Näme üçin beýle usullar amatly? Ilki bilen, sebäbi dürli parametrler bilen işlemäge mümkinçilik berýär. Şol bir logika dürli görnüşlere arkaýyn ulanylyp bilinýän bolsa, umumy usul ajaýyp çözgütdir. Bir mysala seredeliň. Bizde haýsydyr bir sanaw bar diýeliň myList1. Ondan ähli bahalary aýyrmak we ähli boş ýerleri täze baha bilen doldurmak isleýäris. Umumy usul bilen synpymyzyň görnüşi:
public class TestClass {

   public static <T> void fill(List<T> list, T val) {
       for (int i = 0; i < list.size(); i++)
           list.set(i, val);
   }

   public static void main(String[] args) {

       List<String> strings = new ArrayList<>();
       strings.add("Старая строка 1");
       strings.add("Старая строка 2");
       strings.add("Старая строка 3");

       fill(strings, "Новая строка");

       System.out.println(strings);

       List<Integer> numbers = new ArrayList<>();
       numbers.add(1);
       numbers.add(2);
       numbers.add(3);

       fill(numbers, 888);
       System.out.println(numbers);
   }
}
Sintaksisine üns beriň, birneme üýtgeşik görünýär:
public static <T> void fill(List<T> list, T val)
Yza gaýdyp geliş görnüşi umumy usuly görkezýän <T> öňünden gelýär. Bu ýagdaýda usul giriş hökmünde 2 parametr alýar: T obýektleriň sanawy we başga bir aýratyn obýekt T. <T> ulanyp, usulyň ýazylmagy gazanylýar: setirleriň we sanlaryň sanawyny ol ýerden geçirip bilmeris. Setirleriň we setirleriň sanawy, sanlaryň we sanlaryň sanawy, obýektlerimiziň sanawy Catwe başga bir obýekt Cat- bu ýeke-täk ýol. Usul main(), usulyň fill()dürli maglumatlar bilen aňsatlyk bilen işleýändigini aýdyň görkezýär. Ilki bilen setirleriň we setirleriň sanawyny, soň bolsa sanlaryň we sanlaryň sanawyny alýar. Konsol çykyşy: [Newline, Newline, Newline] [888, 888, 888] 30 dürli synp üçin usuly logika gerek bolsa fill(), umumy usullarymyz ýok bolsa göz öňüne getiriň. Diňe dürli maglumatlar görnüşleri üçin şol bir usuly 30 gezek ýazmaga mejbur bolarys! Generöne umumy usullaryň kömegi bilen kodumyzy gaýtadan ulanyp bileris! :)

Görkezilen synplar

Diňe Java-da berlen umumy synplary ulanyp bilmän, özüňizem döredip bilersiňiz! Ine ýönekeý mysal:
public class Box<T> {

   private T t;

   public void set(T t) {
       this.t = t;
   }

   public T get() {
       return t;
   }

   public static void main(String[] args) {

       Box<String> stringBox = new Box<>();

       stringBox.set("Старая строка");
       System.out.println(stringBox.get());
       stringBox.set("Новая строка");

       System.out.println(stringBox.get());

       stringBox.set(12345);//ошибка компиляции!
   }
}
Biziň synpymyz Box<T>(“guty”) ýazylýar. Dörediş döwründe oňa maglumat görnüşini () bellänimizden soň <T>, başga görnüşli zatlary ýerleşdirip bilmeris. Muny mysalda görmek bolýar. Döredilende, obýektimiziň setirler bilen işlejekdigini kesgitledik:
Box<String> stringBox = new Box<>();
Kodyň iň soňky setirinde 12345 belgisini gutynyň içine saljak bolanymyzda, düzmek ýalňyşlygy ýüze çykýar! Edil şonuň ýaly, biz öz umumy synpymyzy döretdik! :) Bu gün leksiýamyzy tamamlaýar. Genöne generikler bilen hoşlaşamzok! Indiki leksiýalarda has ösen aýratynlyklar barada gürleşeris, hoşlaşmaň! ) Okuwyňyzda üstünlik arzuw ediň! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION