JavaRush /Java Blog /Random-TK /Üýtgeýjilere giriň. Hususy, goralýan, asyl, köpçülige

Üýtgeýjilere giriň. Hususy, goralýan, asyl, köpçülige

Toparda çap edildi
Salam! Şu günki leksiýamyzda “ giriş üýtgedijileri ” düşünjesi bilen tanşarys we olar bilen işlemegiň mysallaryna serederis. Üýtgeýjilere giriň.  Hususy, goralýan, asyl, köpçülige - 1“Geliň, tanyşalyň” sözi düýbünden dogry bolmaz: siz olaryň köpüsi bilen öňki leksiýalardan eýýäm tanyş. Şeýle bolan ýagdaýynda, esasy zat hakda ýadymyzy täzeläliň. Giriş üýtgedijileri köplenç koduňyzyň dürli böleklerine giriş derejesini kadalaşdyrýan açar sözlerdir. Näme üçin "köplenç"? Sebäbi olaryň biri deslapky görnüşde kesgitlenýär we açar söz bilen görkezilmeýär :) Java-da jemi dört giriş üýtgediji bar. Olary iň berkden iň “ýumşak” tertipde sanap geçýäris:
  • hususy;
  • goragly;
  • deslapky (bukja görünýär);
  • köpçülik
Geliň, olaryň hersine seredeliň, haçan bize peýdaly bolup biljekdigini çözeliň we mysallar bereliň :)

Üýtgediji şahsy

Üýtgeýjilere giriň.  Hususy, goralýan, asyl, köpçülige - 2Private- iň çäklendiriji giriş üýtgediji. Bir synpyň içinde maglumatlaryň we usullaryň görünmegini çäklendirýär. Bu üýtgedijini alýanlar we sazlaýjylar baradaky leksiýadan bilýärsiňiz. Bu mysaly ýadyňyzdamy?
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Mundan öň makalalaryň birinde seredipdik. Bu ýerde çynlakaý ýalňyşlyk goýberdik: maglumatlary açdyk, netijede beýleki programmistler synp meýdanlaryna gönüden-göni girip, gymmatlyklaryny üýtgetdiler. Mundan başga-da, bu gymmatlyklar barlagsyz bellendi, netijede programmamyzda -1000 ýaşyndaky, "ady" we 0 agramy bolan pişigi döredip bolýar. Bu meseläni çözmek üçin biz ulanyjylar we sazlaýjylar , şeýle hem üýtgediji ulanyp maglumatlara çäklendirilen giriş private.
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // checking the input parameter
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // checking the input parameter
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // checking the input parameter
       this.weight = weight;
   }
}
Aslynda, meýdanlara girmegi çäklendirmek we girdeji gazanýanlary durmuşa geçirmek privatehakyky işde iň köp ulanylýan mysaldyr. .Agny, programmada encapsulýasiýany amala aşyrmak bu üýtgedijiniň esasy maksadydyr. Wayeri gelende aýtsak, bu diňe meýdanlara degişli däl. Programmaňyzda gaty çylşyrymly işlemegi amala aşyrýan usul bar diýip göz öňüne getiriň. Muňa mysal hökmünde gelmek üçin ... Geliň, usulyňyz readDataFromCollider()giriş hökmünde maglumatlar bilen adresi alýar, Uly Hadron Collider-den maglumatlary baýt görnüşinde okaýar, bu maglumatlary tekste öwürýär, faýla ýazýar we çap edýär. Hatda usulyň beýany gysganç görünýär, kod goýmasyn :) Kodyň okalmagyny ýokarlandyrmak üçin çylşyrymly usul logikasyny bir ýerde ýazman, tersine, işlemegi aýratyn usullara bölmek gowy bolardy. . Mysal üçin, bu usul maglumatlary okamak, kollaýderden okalýan maglumatlary tekste öwürmek, emele gelen teksti faýla ýazdyrmak we maglumatlar faýlymyzy çap etmek readByteData()üçin jogapkärdir . Usul has ýönekeý bolar: convertBytesToSymbols()saveToFile()printColliderData()readDataFromCollider()
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // convert bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // save the read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // print data from file
   }
}
Şeýle-de bolsa, interfeýslerdäki leksiýadan ýadyňyzda bolsa, ulanyjy diňe soňky interfeýsine girip biler. 4 usulymyz hem onuň bir bölegi däl. Olar kömekçi : kodlaryň okalmagyny gowulandyrmak we dört dürli meseläni bir usula jemlemezlik üçin olary döretdik. Ulanyja bu usullara girmäge zerurlyk ýok. Ulanyjy kollaýder bilen işleşende bu usula girip bilýän bolsa convertBytesToSymbols(), bu usulyň nämedigine we näme üçin zerurdygyna düşünmez. Haýsy baýt öwrüler? Olar nireden geldiler? Näme üçin olary tekste öwürmeli? Bu usulda işleýän logika ulanyjy interfeýsiniň bir bölegi däl. Diňe usul readDataFromCollider()interfeýsiň bir bölegidir. Bu dört "içerki" usul bilen näme etmeli? Dogry! Üýtgediji bilen olara girmegi çäklendiriň private. Şeýlelik bilen, synpyň içindäki işlerini aňsatlyk bilen ýerine ýetirip bilerler we hersiniň logikasyna aýratyn mätäç bolmadyk ulanyjyny bulaşdyrmazlar.
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // convert bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // save the read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // print data from file
   }
}

Üýtgediji goralandyr

Indiki iň çäklendiriji giriş üýtgediji protected. Üýtgeýjilere giriň.  Hususy, goralýan, asyl, köpçülige - 3 Giriş modifikatory bilen kesgitlenen meýdanlar we usullar protectedgörüner:
  • biziňki ýaly paketdäki ähli synplaryň içinde;
  • synpymyzyň ähli mirasdüşer synplarynyň içinde.
Munuň haçan zerur bolup biljekdigini derrew göz öňüne getirmek kyn. Geň galmaň: protectedýüz tutmagyň ýagdaýlary has az privatewe olar aýratyn. AbstractSecretAgentKäbir aňtaw gullugynyň gizlin agentini, şeýle hem bu synpy we onuň nesillerini öz içine alýan abstrakt synpymyzy göz öňüne getiriň top_secret. Beton synplar - FBISecretAgentwe MI6SecretAgentş.m. MossadSecretAgentondan miras galypdyr. Abstrakt synpyň içinde agent hasaplaýjysyny durmuşa geçirmek isleýäris. Programmanyň bir ýerinde täze agent obýekti döredilende, köpeler.
package top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Emma biziň wekillerimiz gizlin! Diýmek, olaryň sany barada diňe olar we başga hiç kim bilmeli däldir. protectedMeýdana aňsatlyk bilen üýtgediji goşup bileris agentCount, soň beýleki gizlin agent synplarynyň obýektleri ýa-da “gizlin” bukjamyzdaky synplar onuň bahasyny alyp biler top_secret.
public abstract class AbstractSecretAgent {

   protected static int agentCount = 0;
}
Şeýle anyk meseleler üçin üýtgediji gerek protected:)

görünýän üýtgeýän üýtgediji

Sanawymyzda indiki üýtgediji defaultýa-da atlandyrylyşy ýaly package visible,. Açar söz bilen görkezilmeýär, sebäbi ähli meýdanlar we usullar üçin Java-da deslapky görnüşde kesgitlenýär. Koduňyzda ýazsaňyz -
int x = 10;
... üýtgeýjiniň hem xşol bir ygtyýary bolar package visible. Usul (ýa-da üýtgeýän) haýsydyr bir üýtgediji bilen bellenmedik bolsa, "deslapky üýtgediji" bilen bellik edilýär. Şeýle üýtgediji bilen üýtgeýjiler ýa-da usullar, ýagny yglan edilen paketiň ähli synplaryna görünýär. Diňe olara. Onuň ulanylyşy üýtgediji ýaly çäklidir protected. Köplenç, default-access bu bukjadaky beýleki synplaryň işleýşini durmuşa geçirmeýän käbir peýdaly synplar bolan bukjada ulanylýar. Mysal getireliň. Bizde " hyzmatlar " bukjasynyň bardygyny göz öňüne getiriň. Içinde maglumatlar bazasy bilen işleýän dürli synplar bar. UserServiceMysal üçin, maglumatlar bazasyndan ulanyjy maglumatlaryny okaýan synp , CarServiceşol bir maglumatlar bazasyndaky awtoulaglar hakda maglumatlary okaýan we beýleki synplar bar, bularyň hersi öz obýektleri bilen işleýär we maglumatlar bazasyndan olar hakda maglumatlary okaýar.
package services;

public class UserService {
}

package services;

public class CarService {
}
Şeýle-de bolsa, maglumatlar bazasyndaky maglumatlar bir formatda bolanda aňsatlyk bilen bolup biler, ýöne bize başga bir görnüşde gerek. Maglumatlar bazasynda ulanyjynyň doglan senesiniň WAGT ZONASY BILEN TIMESTAMP görnüşinde saklanýandygyny göz öňüne getiriň ...
2014-04-04 20:32:59.390583+02
... munuň ýerine iň ýönekeý obýekt gerek - java.util.Date. servicesBu maksat bilen, bukjanyň içinde ýörite synp döredip bileris Mapper. Maglumatlar bazasyndan maglumatlary tanyş bolan Java obýektlerine öwürmek üçin jogapkärçilik çeker. Simpleönekeý kömekçi synpy. Adatça ähli synplary döredýäris public class ClassName, ýöne bu hökman däl. Kömekçi synpymyzy edil şonuň ýaly yglan edip bileris class Mapper. Bu ýagdaýda ol henizem öz işini edýär, ýöne bukjanyň daşyndaky hiç kime görünmeýär services!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Aslynda bu dogry logika: näme üçin paketiň daşyndaky biri diňe bir paketiň synplary bilen işleýän kömekçi synpy görer?

köpçülikleýin üýtgediji

Sanawda iň soňkusy, ýöne iň bolmanda - üýtgediji public! JavaRush-da okaýan ilkinji günüňizde onuň bilen tanyşdyňyz public static void main(String[] args). Üýtgeýjilere giriň.  Hususy, goralýan, asyl, köpçülige - 4 Indi interfeýsler baradaky leksiýalary öwreneniňizden soň, onuň maksady size mälimdir :) Galyberse-de, publiculanyjylara bir zat bermek üçin döredildi. Mysal üçin, programmaňyzyň interfeýsi. Terjimeçi programmasy ýazdyňyz diýeliň we rus dilini iňlis diline terjime edip biler. translate(String textInRussian)Zerur logikanyň ýerine ýetirilýän usulyny döretdiňiz . Bu usuly söz bilen bellediňiz public, indi bolsa interfeýsiň bir bölegi bolar:
public class Translator {

   public String translate(String textInRussian) {

       // translates text from Russian to English
   }
}
Bu usula çagyryşy programmanyň ekranyndaky “terjime” düwmesi bilen baglanyşdyryp bilersiňiz - bu hut şu! Islendik adam ulanyp biler. Koduň üýtgediji bilen bellenen bölekleri publicahyrky ulanyjy üçin niýetlenendir. Durmuşdan mysal getirmek üçin, privatebularyň hemmesi işleýän wagty telewizoryň içinde bolup geçýän prosesler we publicbular ulanyjynyň dolandyryp bilýän telewizoryň uzakdaky dolandyryş düwmeleri. Şol bir wagtyň özünde, telewizoryň nähili işleýändigini we nähili işleýändigini bilmek zerurlygy ýok. Uzakdan dolandyrmak - usullaryň publictoplumy : on(),,,, we ş.m.off()nextChannel()previousChannel()increaseVolume()decreaseVolume()
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION