JavaRush /Java блогу /Random-KY /Кофе-брейк №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 тorнде "бардык нерсени" көрсөтүү үчүн колдонулат. Аны колдонуу менен биз пакеттин субпакетинин ичиндеги нерселердин баарын импорттой алабыз. Мисал: Tools деп аталган пакетти карап көрөлү . Эгерде биз бул пакеттин ичиндеги нерселердин баарын импорттоону кааласак, анда импорттук билдирүүнү колдонушубуз керек:
import tools.*;
  • Import package.ClassName колдонуу ;
Пакеттеги класстын атын атап өтүү - бул сиздин программаңызга керектүү класстарды гана импорттоонун эффективдүү жолу, ошону менен керексиз класстарды импорттоодон сактайт. Мисал: китептер деп аталган пакетти карап көрөлү . Эгерде биз андан белгилүү бир классты же интерфейсти гана импорттоону кааласак (биз Pages классын карап чыгабыз ), анда биз муну жөн гана импорттойбуз:
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 annotation түрү.

Жаңы баштагандар үчүн Thread-Коопсуз Java методдору

Булак: Medium Бул макаланы колдонуу менен, 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 эс тутум моделинде бизде стек жана үймөк бар. Ар бир жиптин өзүнүн стеки бар жана бардык жиптер бирдей үймөктү бөлүшөт. Бул жагынан алганда, стек маалыматтары дайыма жип коопсуз, бирок үймөк маалыматтар андай эмес. Стек примитивдерди жана an objectке шилтемелерди сактайт. Үймөк an objectтердин өздөрүн камтыйт. Бул бул code мисалында ар бир жип стекте өзүнүн өзгөрмө эсептегичтерин сактайт жана башка жиптердин маалыматтарына эч кандай таасир этпейт, ошондуктан метод жип коопсуз . String киргизүү мааниси да an object экенин эске алыңыз , бирок 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 an objectисин колдонгон . Мурунку бөлүктөн биз Javaдагы an objectтер үймөктө сакталаарын жана List an object экенин билебиз. Биз ошондой эле стек үймөктөгү an objectтерге шилтемелерди сактай турганын билебиз. Мисал №2, ар бир жип жаңы ArrayList an objectин түзөт : жана listCounter өзгөрмөсү үймөктө өзүнүн an objectисине шилтемени сактайт, ошондуктан башка эч бир жип ал an objectти өзгөртө алbyte.
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 колдонушат , ал үймөктө бир эле 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 долбоорлорунда жиптин коопсуздугунун бардык аспектилерин камтыbyte, бирок алар баштоо үчүн жакшы жер. Кийинки жолу codeуңуздан ыкманы көргөнүңүздө, өзүңүздөн: "Бул ыкма жип коопсузбу?" Жана жакында сиз жоопту так түшүнөсүз.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION