JavaRush /Java блогы /Random-KK /Кофе-брейк №165. Java тіліндегі пакеттер. Жаңадан бастауш...

Кофе-брейк №165. Java тіліндегі пакеттер. Жаңадан бастаушыларға арналған жіпке қауіпсіз әдістер

Топта жарияланған

Java пакеттері

Дереккөз: Usemynotes Бұл жазба Java-дағы пакеттерді жақсырақ түсінуге, олардың мақсатын және оларды қалай жүзеге асыру керектігін түсінуге көмектеседі. Кофе-брейк №165.  Java тіліндегі пакеттер.  Жаңадан бастаушыларға арналған жіпті қауіпсіз әдістер - 1

Java-да пакеттер дегеніміз не

Java-дағы бума – бұл сыныптар, интерфейстер және ішкі пакеттер тобын біріктіру тәсілі. Бумалар байланысты кластар, интерфейстер, тізімдер және т.б. топтарын құру үшін пайдаланылады. Ішкі бумалар - бұл басқа буманың ішінде болатын бумалар. Олар әдепкі бойынша импортталмайды, бірақ қажет болса, оларды қолмен импорттауға болады. Қол жеткізу спецификациясы ішкі буманың жеке мүшелеріне берілмейді, олар бөлек бумалар ретінде қарастырылады.

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-да бума иерархиясын қалай жасауға болады?

Иерархияны қалыптастыру кезінде Java-дағы бумалар кері ретпен аталады. Бұл оларды каталогтарға немесе қалталарға өте ұқсас етеді. Бір қалтада бір немесе бірнеше ішкі қалта болуы мүмкін дербес компьютердегі сияқты, Java пакеттеріне де қатысты. Asia.India.Kolkata атты пакетті қарастырайық . Мұның бәрі бар қалталар, бірақ егер сіз географияны қарастырсаңыз, Калькутта Үндістанда, ал Үндістан Азияда екені анық. Иерархияның негізгі мақсаты - сыныптарды табуды жеңілдету.

Java тіліндегі бума түрлері

Кірістірілген пакеттер

Кірістірілген пакеттер Java API бөлігі болып табылатын кіріктірілген сыныптардың үлкен санынан тұратын пакеттер. Бұл пакеттерге мыналар кіреді:
  • java.util - Бұл бумада байланыстырылған тізім, жиындар және т.б. сияқты деректер құрылымдарын іске асыру үшін пайдаланылатын қызметтік сыныптардың шектеулі саны бар. Ол сондай-ақ күн мен уақыт операцияларын және т.б. қолдайды.
  • java.net - Ол желілік операциялар үшін пайдаланылатын сыныптарды қамтиды.

Пайдаланушы анықтайтын бумалар

Пайдаланушы анықтайтын бумалар пайдаланушы бумалары деп аталады. Пайдаланушы буманы қолмен жасай алады және онда қалағанша көп сыныптар болады.

Басқа пакеттен пакетке қалай қол жеткізуге болады?

Басқа пакеттен пакетке үш қарапайым жолмен қол жеткізе аласыз:
  • Импорттау мәлімдемесінде жұлдызшаны пайдалану
Жұлдызша ( * ) таңбасы Java тіліндегі «барлық заттарды» көрсету үшін қолданылады. Оны пайдалану арқылы біз пакеттің ішкі бумасындағы барлық нәрсені импорттай аламыз. Мысал: tools деп аталатын буманы қарастырайық . Егер біз осы пакеттің ішіндегі барлық нәрсені импорттағымыз келсе, импорт мәлімдемесін пайдалануымыз керек:
import tools.*;
  • Импорт пакетін пайдалану.ClassName ;
Бумадағы сынып атын атап өту - бұл қажетсіз сыныптарды импорттауды болдырмай, бағдарламаға тек қажет сыныптарды импорттаудың тиімді жолы. Мысал: books деп аталатын буманы қарастырайық . Егер біз одан белгілі бір сыныпты немесе интерфейсті ғана импорттағымыз келсе (біз Pages сыныбына қарайтын боламыз ), онда біз мынаны пайдаланып импорттай аламыз:
import book.Pages;
  • Толық атыңызды пайдалану
Java пакетін немесе оның сыныптарын олардың толық жарамды атауын пайдалану арқылы тікелей пайдаланудың жолы бар. Осылайша пакетті импорттаудың қажеті жоқ және оны тікелей бағдарламада пайдалана аласыз. Мысалы:
java.awt.List aSimpleList = new java.awt.List();

Java тіліндегі әдепкі пакет өлшемі

Әдепкі бойынша Java java.lang бумасын импорттайды . Оның String , Integer және басқалары сияқты қарапайым Java бағдарламаларында жиі қолданылатын көптеген сыныптары бар . Ең маңызды класстардың бірі Object класы болып табылады, ол өз кезегінде java.lang пакетінде де кездеседі . Бұл буманың өлшемі оның құрамдас бөліктеріне негізделген: 8 интерфейс, 37 сынып, 3 тізім, 27 ерекшелік, 23 қате түрі және 5 annotation түрі.

Жаңадан бастаушыларға арналған Thread-Қауіпсіз 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 мәнін қайтарады және жол параметрін енгізу ретінде қабылдайды.
  • Әдіс ішінде қарабайыр айнымалы есептегіш құрылады, содан кейін цикл кіріс жолының таңбалары арқылы өтеді және әріптік таңба кездескен сайын айнымалы есептегішті ұлғайтады.
Бұл әдіс жіп қауіпсіз бе? Көптеген әзірлеушілер «жоқ» дейді, өйткені бұл жағдайда бізде ағынды қауіпсіз емес арттыру операциясы бар. Оны анықтап көрейік. Java жады үлгісінде бізде стек пен үйме бар. Әрбір ағынның өз стекі бар және барлық ағындар бірдей үйінді бөліседі. Осыған байланысты стек деректері әрқашан ағынды қауіпсіз, бірақ үйме деректері олай емес. Стек примитивтер мен нысан сілтемелерін сақтайды. Үймеде нысандардың өздері болады. Бұл осы code мысалында әрбір ағын стекке өзінің айнымалы есептегішін сақтайтынын және басқа ағындардың деректеріне ешқандай әсер етпейтінін білдіреді, сондықтан әдіс ағынды қауіпсіз . Жолдың кіріс мәні де нысан екенін ескеріңіз, бірақ String және қарапайым орауыштар ( 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 айнымалысының орнына List нысанын пайдаланды . Алдыңғы бөлімнен біз Java тіліндегі нысандар үйіндіде сақталатынын білеміз, ал List нысан болып табылады. Біз сонымен қатар стек үймедегі нысандарға сілтемелерді сақтайтынын білеміз. №2 мысалда әрбір ағын жаңа ArrayList нысанын жасайды : және listCounter айнымалысы өз нысанына сілтемені үймеде сақтайды, сондықтан ешбір басқа ағын бұл нысанды өзгерте алмайды.
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();
    }
}
Бұл мысалда бізде listCounter жаһандық айнымалысы бар синглтон (бұл маңызды) CounterUtil сыныбы бар . Бұл айнымалы синглтон данасымен бір уақытта жасалады. Бірнеше ағындар countChars3 әдісін шақырғанда , олардың барлығы бірдей жаһандық айнымалы listCounter пайдаланады , ол үймеде бір нысанға сілтемені сақтайды және ондағы ағындар бір-біріне әсер етеді. Сондықтан бұл әдіс қауіпсіз емес деп қорытынды жасауға болады. Тіпті 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