1. பண்புகள்: பெறுபவர்கள் மற்றும் செட்டர்கள்

ஒரு பெரிய திட்டம் ஒரே நேரத்தில் டஜன் கணக்கான புரோகிராமர்களால் உருவாக்கப்படும் போது, ​​அவர்கள் வகுப்புத் துறைகளில் சேமிக்கப்பட்ட தரவை வித்தியாசமாக கையாண்டால் சிக்கல்கள் அடிக்கடி எழுகின்றன.

வகுப்பு ஆவணங்களை மக்கள் விரிவாகப் படிக்கத் தவறியிருக்கலாம் அல்லது ஒவ்வொரு வழக்கையும் அது விவரிக்காமல் இருக்கலாம். இதன் விளைவாக, ஒரு பொருளின் உள் தரவு "கெட்டதாக" மாறும் சூழ்நிலைகள் அடிக்கடி ஏற்படுகின்றன, இதனால் பொருள் செல்லாது.

இந்த சூழ்நிலைகளைத் தவிர்க்க, ஜாவாவில் அனைத்து வகுப்பு புலங்களையும் தனிப்பட்டதாக மாற்றுவது வழக்கம் . வகுப்பின் முறைகள் மட்டுமே வகுப்பின் மாறிகளை மாற்றியமைக்க முடியும். மற்ற வகுப்புகளின் எந்த முறைகளும் மாறிகளை நேரடியாக அணுக முடியாது.

உங்கள் வகுப்பின் பொருள்களுக்குள் உள்ள தரவைப் பிற வகுப்புகள் பெறவோ அல்லது மாற்றவோ முடியும் என நீங்கள் விரும்பினால், உங்கள் வகுப்பில் இரண்டு முறைகளைச் சேர்க்க வேண்டும் - பெறு முறை மற்றும் ஒரு தொகுப்பு முறை. உதாரணமாக:

குறியீடு குறிப்பு
class Person
{
   private String name;

   public Person(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return name;
   }

   public void setName(String name)
   {
      this.name = name;
   }
}


privateபெயர் புலம்



கன்ஸ்ட்ரக்டர் வழியாக புலத்தின் துவக்கம்


getName()- இந்த முறை பெயர் புலத்தின் மதிப்பை வழங்குகிறது




setName()- இந்த முறை பெயர் புலத்தின் மதிப்பை மாற்றுகிறது

வேறு எந்த வகுப்பினரும் பெயர் புலத்தின் மதிப்பை நேரடியாக மாற்ற முடியாது. getName() யாராவது பெயர் புலத்தின் மதிப்பைப் பெற வேண்டும் என்றால், அவர்கள் ஒரு பொருளின் மீது முறையை அழைக்க வேண்டும் Person. சில குறியீடு பெயர் புலத்தின் மதிப்பை மாற்ற விரும்பினால், அது setName() ஒரு Personபொருளின் முறையை அழைக்க வேண்டும்.

இந்த முறை " பெயர் புலத்திற்கான பெறுபவர்getName() " என்றும் அழைக்கப்படுகிறது , மேலும் இந்த முறை " பெயர் புலத்திற்கான அமைப்பாளர் " என்றும் அழைக்கப்படுகிறது .setName()

இது மிகவும் பொதுவான அணுகுமுறை. அனைத்து ஜாவா குறியீட்டில் 80-90% இல், நீங்கள் ஒரு வகுப்பில் பொது மாறிகளை பார்க்க முடியாது. அதற்கு பதிலாக, அவை அறிவிக்கப்படும் private(அல்லது protected), மேலும் ஒவ்வொரு மாறிக்கும் பொது பெறுபவர்கள் மற்றும் செட்டர்கள் இருக்கும்.

இந்த அணுகுமுறை குறியீட்டை நீண்டதாக ஆக்குகிறது, ஆனால் மிகவும் நம்பகமானது.

வகுப்பு மாறியை நேரடியாக அணுகுவது உங்கள் காரை இரட்டை மஞ்சள் கோடுகள் மூலம் திருப்புவது போன்றது : இது எளிதானது மற்றும் வேகமானது, ஆனால் எல்லோரும் அதைச் செய்தால், அனைவருக்கும் நிலைமை மோசமாகிவிடும்.

xஒரு புள்ளியை ( , ) விவரிக்கும் வகுப்பை உருவாக்க விரும்புகிறீர்கள் என்று வைத்துக் கொள்வோம் y. ஒரு புதிய புரோகிராமர் அதை எப்படி செய்வார் என்பது இங்கே:

class Point
{
   public int x;
   public int y;
}

அனுபவம் வாய்ந்த ஜாவா புரோகிராமர் இதை எப்படி செய்வார் என்பது இங்கே:

குறியீடு
class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }

   public int getX() {
      return x;
   }

   public void setX(int x) {
      this.x = x;
   }

   public int getY() {
      return y;
   }

   public void setY(int y) {
      this.y = y;
   }
}

குறியீடு நீளமாக உள்ளதா? சந்தேகத்திற்கு இடமின்றி.

ஆனால் நீங்கள் பெறுபவர்கள் மற்றும் செட்டர்களுக்கு அளவுரு சரிபார்ப்பைச் சேர்க்கலாம். எடுத்துக்காட்டாக, நீங்கள் எப்போதும் பூஜ்ஜியத்தை விட அதிகமாக இருப்பதையும் (அல்லது பூஜ்ஜியத்திற்குக் குறையாமல்) இருப்பதையும் உறுதிப்படுத்திக் xகொள்ளலாம் y. உதாரணமாக:

குறியீடு குறிப்பு
class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
      this.x = x < 0 ? 0 : x;
      this.y = y < 0 ? 0 : y;
   }

   public int getX() {
      return x;
   }

   public void setX(int x) {
      this.x = x < 0 ?  0 : x;
   }

   public int getY() {
      return y;
   }

   public void setY(int y) {
      this.y = y < 0 ? 0 : y;
   }
}


2. பொருள் வாழ்நாள்

ஆபரேட்டரைப் பயன்படுத்தி பொருள்கள் உருவாக்கப்படுகின்றன என்பதை நீங்கள் ஏற்கனவே அறிவீர்கள் new, ஆனால் பொருள்கள் எவ்வாறு நீக்கப்படுகின்றன? அவர்கள் என்றென்றும் இருப்பதில்லை. அதற்கு போதிய நினைவாற்றல் இல்லை.

C++ போன்ற பல நிரலாக்க மொழிகளில், deleteபொருட்களை நீக்க ஒரு சிறப்பு ஆபரேட்டர் உள்ளது. ஆனால் ஜாவாவில் இது எப்படி வேலை செய்கிறது?

ஜாவாவில், எல்லாம் கொஞ்சம் வித்தியாசமாக ஏற்பாடு செய்யப்பட்டுள்ளது. ஜாவாவில் டெலிட் ஆபரேட்டர் இல்லை. ஜாவாவில் பொருள்கள் நீக்கப்படவில்லை என்று அர்த்தமா? இல்லை, நிச்சயமாக, அவை நீக்கப்பட்டன. இல்லையெனில், ஜாவா பயன்பாடுகள் விரைவாக நினைவகம் தீர்ந்துவிடும், மேலும் பல மாதங்களுக்கு இடையூறு இல்லாமல் இயங்கும் நிரல்களைப் பற்றிய பேச்சு இருக்காது.

ஜாவாவில், பொருட்களை நீக்குவது முற்றிலும் தானியங்கி முறையில் செய்யப்படுகிறது. பொருட்களை நீக்குவதை ஜாவா இயந்திரமே கையாளுகிறது. இந்த செயல்முறை குப்பை சேகரிப்பு என்றும், குப்பைகளை சேகரிக்கும் வழிமுறை குப்பை சேகரிப்பான் ( GC ) என்றும் அழைக்கப்படுகிறது.

ஒரு பொருளை எப்போது நீக்க வேண்டும் என்பதை ஜாவா இயந்திரம் எப்படி அறிவது?

குப்பை சேகரிப்பான் அனைத்து பொருட்களையும் "அடையக்கூடியது" மற்றும் "அடையாதது" என்று பிரிக்கிறது. ஒரு பொருளுக்கு குறைந்தபட்சம் ஒரு குறிப்பு இருந்தால், அது அடையக்கூடியதாக கருதப்படுகிறது. ஒரு பொருளைக் குறிக்கும் மாறிகள் எதுவும் இல்லை என்றால், பொருள் அடைய முடியாததாகக் கருதப்பட்டு குப்பை என்று அறிவிக்கப்படும், அதாவது அதை நீக்க முடியும்.

ஜாவாவில், ஏற்கனவே உள்ள பொருளுக்கு நீங்கள் குறிப்பை உருவாக்க முடியாது - உங்களிடம் ஏற்கனவே உள்ள குறிப்புகளை மட்டுமே நீங்கள் ஒதுக்க முடியும். ஒரு பொருளைப் பற்றிய அனைத்து குறிப்புகளையும் நாம் அழித்துவிட்டால், அது என்றென்றும் இழக்கப்படும்.

சுற்றறிக்கை குறிப்புகள்

நாம் ஒரு எளிய எதிர் உதாரணம் வரும் வரை அந்த தர்க்கம் நன்றாக இருக்கும்: ஒன்றையொன்று குறிப்பிடும் இரண்டு பொருள்கள் உள்ளன என்று வைத்துக்கொள்வோம் (ஒருவருக்கொருவர் குறிப்புகளை சேமிக்கவும்). இந்த பொருட்களைப் பற்றிய குறிப்புகளை வேறு எந்தப் பொருட்களும் சேமிப்பதில்லை.

இந்த பொருட்களை குறியீட்டிலிருந்து அணுக முடியாது, ஆனால் அவை இன்னும் குறிப்பிடப்படுகின்றன.

இதனால்தான் குப்பை சேகரிப்பவர் பொருட்களை "குறிப்பிடப்பட்டது" மற்றும் "குறிப்பிடப்படாதது" என்பதற்குப் பதிலாக அடையக்கூடிய மற்றும் அணுக முடியாததாகப் பிரிக்கிறார்.

அடையக்கூடிய பொருள்கள்

முதலில், 100% உயிருடன் இருக்கும் பொருள்கள், அடையக்கூடிய பட்டியலில் சேர்க்கப்படும். எடுத்துக்காட்டாக, தற்போதைய நூல் ( Thread.current()) அல்லது கன்சோல் InputStream ( System.in).

பின்னர் அடையக்கூடிய பொருட்களின் பட்டியல் விரிவடைந்து, அடையக்கூடிய பொருட்களின் ஆரம்ப தொகுப்பால் குறிப்பிடப்படும் பொருட்களை உள்ளடக்குகிறது. இந்த விரிவுபடுத்தப்பட்ட தொகுப்பால் குறிப்பிடப்பட்ட பொருள்கள் மற்றும் பலவற்றைச் சேர்க்க இது மீண்டும் விரிவடைகிறது.

அதாவது, ஒன்றையொன்று மட்டுமே குறிக்கும் சில பொருள்கள் இருந்தால், அவற்றை அடையக்கூடிய பொருட்களிலிருந்து அவற்றை அடைய வழி இல்லை என்றால், அந்த பொருள்கள் குப்பையாகக் கருதப்பட்டு நீக்கப்படும்.


3. குப்பை சேகரிப்பு

நினைவக சிதைவு

பொருள் நீக்கம் தொடர்பான மற்றொரு முக்கியமான புள்ளி நினைவக துண்டு துண்டாக உள்ளது. நீங்கள் தொடர்ந்து பொருட்களை உருவாக்கி நீக்கினால், விரைவில் நினைவகம் பெரிதும் துண்டாடப்படும்: ஆக்கிரமிக்கப்பட்ட நினைவகத்தின் பகுதிகள் ஆக்கிரமிக்கப்படாத நினைவகத்தின் பகுதிகளுடன் குறுக்கிடப்படும்.

இதன் விளைவாக, ஒரு பெரிய பொருளை (உதாரணமாக, ஒரு மில்லியன் கூறுகளைக் கொண்ட ஒரு வரிசை) உருவாக்க முடியாத சூழ்நிலையில் நாம் எளிதாகப் பெறலாம், ஏனெனில் இலவச நினைவகத்தின் பெரிய பகுதி இல்லை. வேறு வார்த்தைகளில் கூறுவதானால், இலவச நினைவகம் இருக்கலாம், அதில் நிறைய கூட இருக்கலாம், ஆனால் இலவச நினைவகத்தின் பெரிய தொடர்ச்சியான தொகுதி இருக்காது.

நினைவக மேம்படுத்தல் (டிஃப்ராக்மென்டேஷன்)

ஜாவா இயந்திரம் இந்த சிக்கலை ஒரு குறிப்பிட்ட வழியில் தீர்க்கிறது. இது போல் தெரிகிறது:

நினைவகம் இரண்டு பகுதிகளாக பிரிக்கப்பட்டுள்ளது. அனைத்து பொருட்களும் ஒரு பாதி நினைவகத்தில் உருவாக்கப்படுகின்றன (மற்றும் நீக்கப்பட்டன). நினைவகத்தில் உள்ள துளைகளை சுத்தம் செய்யும் நேரம் வரும்போது, ​​முதல் பாதியில் உள்ள அனைத்து பொருட்களும் இரண்டாம் பாதியில் நகலெடுக்கப்படும். ஆனால் அவை துளைகள் இல்லாதபடி ஒருவருக்கொருவர் நகலெடுக்கப்படுகின்றன.

செயல்முறை தோராயமாக இதுபோல் தெரிகிறது:

படி 1: பொருட்களை உருவாக்கிய பிறகு

ஜாவாவில் குப்பை சேகரிப்பு

படி 2: "துளைகளின்" தோற்றம்

ஜாவா 2 இல் குப்பை சேகரிப்பு

படி 3: "துளைகளை" நீக்குதல்

ஜாவா 3 இல் குப்பை சேகரிப்பு

அதனால்தான் நீங்கள் பொருட்களை நீக்க வேண்டியதில்லை. ஜாவா இயந்திரம், அணுகக்கூடிய அனைத்து பொருட்களையும் ஒரு புதிய இடத்திற்கு நகலெடுக்கிறது, மேலும் பொருள்கள் சேமிக்கப்பட்ட நினைவகத்தின் முழு பகுதியையும் விடுவிக்கிறது.