JavaRush /Блоги Java /Random-TG /Кофе-брейк №165. Бастаҳо дар Java. Усулҳои бехатари ришта...

Кофе-брейк №165. Бастаҳо дар Java. Усулҳои бехатари ришта барои шурӯъкунандагон

Дар гурӯҳ нашр шудааст

бастаҳои Java

Манбаъ: Usemynotes Ин мақола ба шумо кӯмак мекунад, ки бастаҳоро дар Java беҳтар дарк кунед, ҳадафи онҳо ва чӣ гуна татбиқ кардани онҳоро фаҳмед. Кофе-брейк №165.  Бастаҳо дар Java.  Усулҳои бехатарии ришта барои шурӯъкунандагон - 1

Бастаҳо дар Java чистанд

Баста дар Java роҳи гурӯҳбандӣ кардани гурӯҳи синфҳо, интерфейсҳо ва зербастаҳо мебошад. Бастаҳо барои сохтани гурӯҳҳои синфҳои алоқаманд, интерфейсҳо, рӯйхатҳо ва ғайра истифода мешаванд. Зербастаҳо бастаҳое мебошанд, ки дар дохor бастаи дигар ҷойгиранд. Онҳо бо нобаёнӣ ворид карда намешаванд, аммо агар лозим бошад, шумо метавонед онҳоро дастӣ ворид кунед. Мушаххасоти дастрасӣ ба аъзои алоҳидаи зербаста пешниҳод карда намешавад; онҳо ҳамчун бастаҳои алоҳида баррасӣ карда мешаванд.

Баъзе намудҳои бастаҳо дар Java:

  • java.lang - бо нобаёнӣ бо Java баста мешавад.
  • java.io - дорои синфҳо, усулҳо ва дигар унсурҳои марбут ба вуруд/баромад мебошад.

Чаро бастаҳо лозиманд?

  • Барои пешгирӣ кардани ихтилофоти ном.
  • Барои таъмини дастрасии назоратшаванда.
  • Барои ноил шудан ба инкапсуляцияи маълумот.

Чӣ тавр бастаро дар Java эҷод кардан мумкин аст?

Биёед бастаеро бо номи компютер созем . Одатан номи баста бо ҳарфҳои хурд навишта мешавад. Ин танҳо барои пешгирӣ кардани ихтилофи номҳо бо номҳои синф анҷом дода мешавад. Мо инчунин интерфейси бо номи Pluggable эҷод мекунем, ки дар бастаи компютер ҷойгир карда мешавад .
package computer;

interface Pluggable {
   public void pluggedIn();
   public void pluggedOut();
}
Ҳоло мо синферо бо номи PenDrive эҷод мекунем , ки интерфейси болоро амалӣ мекунад.
package computer;

public class PenDrive implements Pluggable {

   int storage = 64;

   public void pluggedIn () {
     System.out.println("Pen Drive is connected");
   }

   public void pluggedOut () {
     System.out.println("Pen Drive is removed");
   }

   public int storage() {
     return storage;
   }

   public static void main(String args[]) {
     PenDrive p = new PenDrive ();
     p.pluggedIn();
     System.out.println("Pen Drive Storage: " + p.storage());
     p.pluggedOut();
   }
}

Чӣ тавр иерархияи бастаҳоро дар Java эҷод кардан мумкин аст?

Ҳангоми ташкor иерархия, бастаҳо дар Java бо тартиби баръакс номгузорӣ мешаванд. Ин онҳоро ба директорияҳо ё ҷузвдонҳо хеле монанд мекунад. Мисли дар компютери шахсӣ, ки дар он як ҷузвдон метавонад як ё якчанд зерпапкаҳоро дар бар гирад, ин ба бастаҳои Java дахл дорад. Биёед бастаеро бо номи Asia.India.Kolkata бубинем . Ин ҳама ҷузвдонҳои мавҷуда ҳастанд, аммо агар шумо ҷуғрофиёро ба назар гиред, маълум мешавад, ки Калкутта дар Ҳиндустон ва Ҳиндустон дар Осиё ҷойгиранд. Мақсади асосии иерархия осон кардани пайдо кардани синфҳо мебошад.

Намудҳои бастаҳо дар Java

Бастаҳои дарунсохт

Бастаҳои дарунсохт бастаҳое мебошанд, ки аз шумораи зиёди синфҳои дарунсохт, ки қисми Java API мебошанд, иборатанд. Ба ин бастаҳо дохил мешаванд:
  • java.util - Ин баста шумораи ниҳоии синфҳои утorтаҳоро дар бар мегирад, ки барои татбиқи сохторҳои додаҳо, аз қабor рӯйхати алоқаманд, маҷмӯаҳо ва ғайра истифода мешаванд. Он инчунин амалиёти сана ва вақт ва ғайраро дастгирӣ мекунад.
  • java.net - Он дорои синфҳое мебошад, ки барои амалиёти шабака истифода мешаванд.

Бастаҳои аз ҷониби корбар муайяншуда

Бастаҳое, ки аз ҷониби корбар муайян карда шудаанд, бастаҳои корбар номида мешаванд. Истифодабаранда метавонад ба таври дастӣ баста эҷод кунад ва дар он миқдори зиёди синфҳо дошта бошад.

Чӣ тавр ба баста аз бастаи дигар дастрасӣ пайдо кардан мумкин аст?

Шумо метавонед ба баста аз бастаи дигар бо се роҳи оддӣ дастрасӣ пайдо кунед:
  • Истифодаи ситорача дар изҳороти воридот
Аломати ситорача ( * ) барои ифодаи "ҳама чиз" дар Java истифода мешавад. Бо истифода аз он, мо метавонем ҳама чизеро, ки дар дохor зербастаи баста мавҷуд аст, ворид кунем. Мисол: Бастаи бо номи асбобҳоро баррасӣ кунед . Агар мо хоҳем, ки ҳама чизеро, ки дар дохor ин баста мавҷуд аст, ворид кунем, пас мо бояд изҳороти воридотро истифода барем:
import tools.*;
  • Истифодаи бастаи импорт.Синф;
Зикр кардани номи синф дар баста як роҳи самараноки ворид кардани танҳо синфҳои лозима ба барномаи шумост ва ба ин васила аз воридоти синфҳои нолозим канорагирӣ мекунад. Мисол: Бастаи бо номи китобҳоро баррасӣ кунед . Агар мо танҳо як синф ё интерфейси мушаххасро аз он ворид кардан хоҳем, (мо ба синфи Саҳифаҳо нигоҳ мекунем ), пас мо метавонем онро бо истифода аз:
import book.Pages;
  • Бо истифода аз номи пурраи худ
Роҳи истифодаи мустақими бастаи Java ё синфҳои он бо истифода аз номи пурраи онҳо вуҷуд дорад. Бо ин роҳ шумо набояд бастаро ворид кунед ва онро мустақиман дар барнома истифода баред. Мисол:
java.awt.List aSimpleList = new java.awt.List();

Андозаи бастаи пешфарз дар Java

Бо нобаёнӣ, Java бастаи java.lang -ро ворид мекунад . Он дорои синфҳои зиёде мебошад, ки маъмулан дар барномаҳои оддии Java ба монанди String , Integer ва ғайра истифода мешаванд. Яке аз синфҳои муҳимтарин синфи Object мебошад, ки дар навбати худ дар бастаи java.lang низ мавҷуд аст . Андозаи ин баста ба ҷузъҳои он асос ёфтааст: 8 интерфейс, 37 синф, 3 рақам, 27 истисно, 23 намуди хато ва 5 намуди эзоҳ.

Усулҳои бехатари Java барои шурӯъкунандагон

Сарчашма: Миёна Бо истифода аз ин мақола, шумо метавонед дар бораи кори усулҳои бехатари ришта дар Java маълумот гиред. Кофе-брейк №165.  Бастаҳо дар Java.  Усулҳои бехатарии ришта барои шурӯъкунандагон - 2Ман фаҳмидам, ки бисёре аз таҳиягарони наврас/миёнаи Java нодуруст мефаҳманд, ки чӣ гуна усулҳои бехатар дар лоиҳаҳои воқеӣ бояд кор кунанд. Ва азбаски мо одатан дар муҳити бисёрсоҳавӣ кор мекунем, истифодаи дурусти онҳо хеле муҳим аст. Усули бехатарии ришта ин усулест, ки метавонад аз риштаҳои сершумор ҳамзамон бидуни таъсир ба ҳолати додаҳои якдигар даъват карда шавад. Фаҳмиши нокифояи ин консепсия боиси хатогиҳое мегардад, ки ёфтан ва ислоҳ кардан душвор аст. Барои он ки ба ин гуна хатохо рох надиханд, биёед ба мисолхо назар кунем.

Мисол №1:

public static int countLetters(String input) {
    int counter = 0;

    for (Character c : input.toCharArray()) {
        if (Character.isAlphabetic(c)) {
            counter++;
        }
    }

    return counter;
}
  • Усули countLetters статикӣ буда, арзиши int-ро бармегардонад ва параметри сатрро ҳамчун вуруд қабул мекунад.
  • Дар дохor усул ҳисобкунаки тағирёбандаи ибтидоӣ сохта мешавад, пас ҳалқа дар байни аломатҳои сатри дохилшавӣ мегузарад ва ҳар дафъае, ки бо аломати ҳарф дучор мешавад, ҳисобкунаки тағирёбандаро зиёд мекунад.
Оё ин усул риштаи бехатар аст? Бисёре аз таҳиягарон мегӯянд, ки не, зеро дар ин ҳолат мо амалиёти афзоянда дорем, ки ришта бехатар нест. Биёед инро фаҳмем. Дар модели хотираи Java мо стек ва теппа дорем. Ҳар як ришта стеки худро дорад ва ҳама риштаҳо як теппаро тақсим мекунанд. Дар робита ба ин, маълумоти стек ҳамеша риштаи бехатар аст, аммо маълумоти теппа ин тавр нест. Стек ибтидоӣ ва истинодҳои an objectро нигоҳ медорад. Тӯда худи an objectҳоро дар бар мегирад. Ин маънои онро дорад, ки дар ин мисоли code ҳар як ришта ҳисобкунаки тағирёбандаи худро дар стек нигоҳ медорад ва ба маълумоти дигар риштаҳо таъсир намерасонад, аз ин рӯ усул риштаи бехатар аст . Аҳамият диҳед, ки арзиши вуруди String низ an object аст, аммо сатр ва парпечҳои ибтидоӣ ( Integer , Long , Double , Boolean ва ғайра) ришта бехатаранд, зеро онҳо тағирнопазиранд.

Мисол №2:

public static int countLetters2(String input) {
    List<Character> listCounter = new ArrayList<>();

    for (Character c : input.toCharArray()) {
        if (Character.isAlphabetic(c)) {
            listCounter.add(c);
        }
    }

    return listCounter.size();
}
Ин code ҳамон мантиқи мисоли аввалро истифода бурд, аммо ба ҷои тағирёбандаи ибтидоии int an objectи List -ро истифода бурд . Аз қисми қаблӣ мо медонем, ки an objectҳо дар Java дар теппа нигоҳ дошта мешаванд ва Рӯйхат an object аст. Мо инчунин медонем, ки стек истинодҳоро ба an objectҳои теппа нигоҳ медорад. Дар мисоли №2, ҳар як ришта an objectи нави ArrayList эҷод мекунад : ва тағирёбандаи listCounter истинодро ба an objectи худ дар теппа нигоҳ медорад, аз ин рӯ ҳеҷ риштаи дигар наметавонад ин an objectро тағир диҳад.
List<Character> listCounter = new ArrayList<>();
Ин маънои онро дорад, ки ин усул ришта бехатар аст.

Мисол №3:

public class CounterUtil { // singleton

    List<Character> listCounter = new ArrayList<>();

    public int countLetters3(String input) {
        for (Character c : input.toCharArray()) {
            if (Character.isAlphabetic(c)) {
                listCounter.add(c);
            }
        }

        return listCounter.size();
    }
}
Дар ин мисол, мо синфи синглтон (ин муҳим аст) дорем CounterUtil бо тағирёбандаи глобалии listCounter . Ин тағирёбанда дар як вақт бо мисоли singleton сохта мешавад. Вақте ки риштаҳои сершумор усули countChars3 -ро даъват мекунанд , онҳо ҳама як тағирёбандаи глобалии listCounter -ро истифода мебаранд , ки истинодро ба ҳамон an object дар теппа нигоҳ медорад ва риштаҳои он ҷо ба ҳамдигар таъсир мерасонанд. Аз ин рӯ, мо метавонем хулоса кунем, ки ин усул ришта бехатар нест. Ва ҳатто агар мо List<Character> listCounter-ро ба тағирёбандаи ибтидоии int counter иваз кунем , он инчунин ришта бехатар нахоҳад буд, зеро ҳамаи риштаҳо як тағирёбандаи ибтидоиро истифода мебаранд.

Намунаи охирин:

public static int countLetters4(List<Character> inputList) {
    List<Character> listCounter = new ArrayList<>();

    for (Character c : inputList) {
        if (Character.isAlphabetic(c)) {
            listCounter.add(c);
        }
    }

    return listCounter.size();
}
Усули countLetters4 ба ҷои параметри String рӯйхати аломатҳоро қабул мекунад . Дар ин ҷо мо кафолат дода наметавонем , ки ин усул бехатар аст. Чаро? Зеро мо наметавонем итминон ҳосил кунем, ки таҳиягарон ин усулро чӣ гуна истифода хоҳанд кард. Агар риштаи дигар аз берун маълумотро дар inputList ҳамзамон бо усули counterLetters4 мо тағир диҳад , он метавонад ба натиҷаи ниҳоӣ таъсир расонад.

Хулоса

Мо танҳо чаҳор мисолро дида баромадем ва онҳо на ҳама ҷанбаҳои бехатарии риштаро дар лоиҳаҳои Java фаро мегиранд, аммо онҳо ҷои хубе барои оғоз мебошанд. Дафъаи дигар, ки шумо дар codeи худ усулеро мебинед, аз худ бипурсед: "Оё ин риштаи риштаи бехатар аст?" Ва хеле ба зудӣ шумо ҷавобро равшан хоҳед фаҳмид.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION