- What Is a Package?
- Кофе-брейк #165. Пакеты на языке Java. Потокобезопасные методы для начинающих
- Что такое пакеты в Java
- Некоторые виды пакетов в Java:
- Зачем нужны пакеты?
- Как создать пакет в Java?
- Как создать иерархию пакетов в Java?
- Типы пакетов в Java
- Встроенные пакеты (Built-in Packages)
- Пользовательские пакеты (User-defined packages)
- Как получить доступ к пакету из другого пакета?
- Размер пакета по умолчанию в Java
- Потокобезопасные методы Java для начинающих
- Пример №1:
- Пример №2:
- Пример №3:
- Последний пример:
- Заключение
What Is a Package?
A package is a namespace that organizes a set of related classes and interfaces. Conceptually you can think of packages as being similar to different folders on your computer. You might keep HTML pages in one folder, images in another, and scripts or applications in yet another. Because software written in the Java programming language can be composed of hundreds or thousands of individual classes, it makes sense to keep things organized by placing related classes and interfaces into packages.
The Java platform provides an enormous class library (a set of packages) suitable for use in your own applications. This library is known as the «Application Programming Interface», or «API» for short. Its packages represent the tasks most commonly associated with general-purpose programming. For example, a String object contains state and behavior for character strings; a File object allows a programmer to easily create, delete, inspect, compare, or modify a file on the filesystem; a Socket object allows for the creation and use of network sockets; various GUI objects control buttons and check boxes and anything else related to graphical user interfaces. There are literally thousands of classes to choose from. This allows you, the programmer, to focus on the design of your particular application, rather than the infrastructure required to make it work.
The Java Platform API Specification contains the complete listing for all packages, interfaces, classes, fields, and methods supplied by the Java SE platform. Load the page in your browser and bookmark it. As a programmer, it will become your single most important piece of reference documentation.
Previous page: What Is an Interface?
Next page: Questions and Exercises: Object-Oriented Programming Concepts
Кофе-брейк #165. Пакеты на языке Java. Потокобезопасные методы для начинающих
Источник: Usemynotes Эта публикация поможет вам лучше изучить пакеты в Java, понять их предназначение и способы реализации.
Что такое пакеты в Java
Пакет (Package) в Java — это способ объединить группу классов, интерфейсов и подпакетов. С помощью пакетов создаются группы связанных классов, интерфейсов, перечислений и так далее. Подпакеты — это пакеты, находящиеся в другом пакете. Они не импортируются по умолчанию, но при необходимости их можно импортировать вручную. Спецификация доступа не предоставляется отдельным членам подпакета, они рассматриваются как разные пакеты.
Некоторые виды пакетов в Java:
- java.lang — по умолчанию поставляется в комплекте с Java.
- java.io — содержит классы, методы и другие элементы, связанные с вводом-выводом.
Зачем нужны пакеты?
- Во избежание конфликтов имен.
- Для обеспечения контролируемого доступа.
- Чтобы добиться инкапсуляции данных.
Как создать пакет в Java?
Давайте создадим пакет с именем computer . Обычно имя пакета пишется строчными буквами. Это делается только для того, чтобы избежать конфликтов имен с именами классов. Также мы создадим интерфейс с именем Pluggable , который будет находиться в пакете computer .
package computer; interface Pluggable
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
Встроенные пакеты (Built-in Packages)
- java.util — этот пакет содержит конечное количество служебных классов, которые используются для реализации структур данных, таких как связанный список, наборы и так далее. Он также поддерживает операции с датой и временем и многое другое.
- java.net — он содержит классы, используемые для сетевых операций.
Пользовательские пакеты (User-defined packages)
Пакеты, определяемые пользователем, называются пользовательскими пакетами. Пользователь может вручную создать пакет и иметь в нем столько классов, сколько захочет.
Как получить доступ к пакету из другого пакета?
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 для начинающих
Источник: Medium Используя эту статью, вы сможете узнать о работе потокобезопасных методов в Java. Я обнаружил, что многие junior/middle Java-разработчики неправильно понимают, как должны работать потокобезопасные (thread-safety) методы в реальных проектах. А поскольку мы обычно работаем в многопоточной среде, то правильное их использование очень важно. Потокобезопасный метод — это метод, который можно вызывать из нескольких потоков одновременно, не влияя на состояние данных друг друга. Недостаточное понимание этой концепции приводит к появлению багов, которые сложно найти и исправить. Чтобы избегать таких ошибок, давайте посмотрим на примеры.
Пример №1:
public static int countLetters(String input) < int counter = 0; for (Character c : input.toCharArray()) < if (Character.isAlphabetic(c)) < counter++; >> return counter; >
- Метод countLetters является статическим, он возвращает значение int и принимает ввод строкового параметра.
- Внутри метода создается примитивный счетчик переменных, затем цикл перебирает символы входной строки и увеличивает счетчик переменных каждый раз, когда встречается буквенный символ.
Пример №2:
public static int countLetters2(String input) < ListlistCounter = new ArrayList<>(); for (Character c : input.toCharArray()) < if (Character.isAlphabetic(c)) < listCounter.add(c); >> return listCounter.size(); >
В этом коде использовалась та же логика, что и в первом примере, но здесь вместо примитивной переменной int использовался объект List . Из предыдущей части мы знаем, что объекты в Java хранятся в куче, а List — это объект. Также мы знаем, что стек хранит ссылки на объекты в куче. В примере №2 каждый поток создает новый объект ArrayList : а переменная listCounter хранит ссылку на свой объект в куче, поэтому никакой другой поток не может изменить этот объект.
List listCounter = new ArrayList<>();
Пример №3:
public class CounterUtil < // singleton ListlistCounter = new ArrayList<>(); public int countLetters3(String input) < for (Character c : input.toCharArray()) < if (Character.isAlphabetic(c)) < listCounter.add(c); >> return listCounter.size(); > >
В этом примере у нас есть одноэлементный (это важно) класс CounterUtil с глобальной переменной listCounter . Эта переменная создается одновременно с экземпляром синглтона. Когда несколько потоков вызывают метод countChars3 , все они используют одну и ту же глобальную переменную listCounter , которая сохраняет ссылку на один и тот же объект в куче, и потоки там будут влиять друг на друга. Поэтому мы можем сделать вывод, что этот метод не является потокобезопасным. И даже если мы поменяем List
Последний пример:
public static int countLetters4(List inputList) < ListlistCounter = new ArrayList<>(); for (Character c : inputList) < if (Character.isAlphabetic(c)) < listCounter.add(c); >> return listCounter.size(); >
Метод countLetters4 принимает список символов вместо параметра String . Здесь мы не можем гарантировать , что этот метод является потокобезопасным. Почему? Потому что мы не можем быть уверены, как разработчики будут использовать этот метод. Если другой поток извне изменит данные в inputList одновременно с нашим методом counterLetters4 , это может повлиять на окончательный результат.
Заключение
Мы рассмотрели только четыре примера, и они не охватывают все аспекты безопасности потоков в Java-проектах, но это хорошее начало для практики. В следующий раз, когда вы увидите какой-либо метод в своем коде, спросите себя: “Этот метод потокобезопасен?”. И очень скоро вы четко будете понимать ответ.