Модификатор на достъп на Java за публичен достъп

1. Общ преглед

В тази бърза статия ще разгледаме подробно публичния модификатор и ще обсъдим кога и как да го използваме с класове и членове.

Освен това ще илюстрираме недостатъците на използването на публични полета за данни.

За общ преглед на модификаторите на достъп определено разгледайте нашата статия за модификаторите на достъп в Java.

2. Кога да използвам модификатора на публичния достъп

Публичните класове и интерфейси, заедно с публичните членове, дефинират API. Това е онази част от нашия код, която другите могат да видят и използват, за да контролират поведението на нашите обекти.

Прекаленото използване на публичния модификатор обаче нарушава принципа на капсулиране на обектно-ориентирано програмиране (OOP) и има няколко недостатъка:

  • Това увеличава размера на API, което затруднява използването на клиентите
  • Става все по-трудно да променим нашия код, защото клиентите разчитат на него - всякакви бъдещи промени може да нарушат техния код

3. Публични интерфейси и класове

3.1. Обществени интерфейси

Публичният интерфейс дефинира спецификация, която може да има една или повече реализации. Тези изпълнения могат да бъдат предоставени от нас или написани от други.

Например Java API излага интерфейса Connection, за да дефинира операции за свързване на база данни, оставяйки действителното изпълнение на всеки доставчик. По време на изпълнение получаваме желаната връзка въз основа на настройката на проекта:

Connection connection = DriverManager.getConnection(url);

Методът getConnection връща екземпляр на специфична за технологията реализация.

3.2. Обществени класове

Дефинираме публични класове, така че клиентите да могат да използват своите членове чрез инстанциране и статично препращане:

assertEquals(0, new BigDecimal(0).intValue()); // instance member assertEquals(2147483647, Integer.MAX_VALUE); // static member 

Освен това, можем да проектираме публични класове за наследяване, като използваме незадължителния модификатор на абстракт . Когато използваме абстрактния модификатор, класът е като скелет, който има полета и предварително внедрени методи, които всяка конкретна реализация може да използва , в допълнение към абстрактните методи, които всеки подклас трябва да внедри.

Например, рамката за колекции на Java предоставя класа AbstractList като основа за създаване на персонализирани списъци:

public class ListOfThree extends AbstractList { @Override public E get(int index) { //custom implementation } @Override public int size() { //custom implementation } }

И така, трябва само да приложим методите get () и size () . Други методи като indexOf () и containsAll () вече са внедрени за нас.

3.3. Вложени публични класове и интерфейси

Подобно на публичните класове и интерфейси от най-високо ниво, вложени публични класове и интерфейси дефинират API тип API. Те обаче са особено полезни по два начина:

  • Те посочват на крайния потребител на API, че ограждащият тип от най-високо ниво и неговите затворени типове имат логическа връзка и се използват заедно
  • Те правят нашата кодова база по-компактна, като намаляват броя на файловете с изходен код, които бихме използвали, ако ги декларирахме като класове и интерфейси от най-високо ниво

Пример е Картата . Интерфейс за влизане от основния Java API:

for (Map.Entry entry : mapObject.entrySet()) { }

Създаване на карта . Въвеждане на вложен интерфейс силно го свързва с интерфейса java.util.Map и ни спаси от създаването на друг файл в пакета java.util .

Моля, прочетете статията за вложени класове за повече подробности.

4. Публични методи

Публичните методи позволяват на потребителите да изпълняват готови операции. Пример е публичният метод toLowerCase в String API:

assertEquals("alex", "ALEX".toLowerCase());

Можем безопасно да направим публичен метод статичен, ако не използва никакви полета на екземпляра. Методът parseInt от класа Integer е пример за публичен статичен метод:

assertEquals(1, Integer.parseInt("1"));

Конструкторите обикновено са публични, за да можем да създадем екземпляри и да инициализираме обекти, въпреки че понякога те могат да бъдат частни, както в единичните.

5. Публични полета

Публичните полета позволяват директно промяна на състоянието на обект. Основното правило е, че не трябва да използваме публични полета. Има няколко причини за това, както предстои да видим.

5.1. Безопасност на резбата

Използването на публична видимост с нефинални полета или окончателни променливи полета не е безопасно за нишки. Не можем да контролираме промяната на техните препратки или състояния в различни нишки.

Моля, проверете нашата статия за безопасност на нишките, за да научите повече за писането на код, безопасен за нишки.

5.2. Предприемане на действия по модификации

Ние нямаме контрол върху нефинално публично поле, защото неговата препратка или състояние може да бъде зададено директно.

Вместо това е по-добре да скриете полетата с помощта на частен модификатор и да използвате публичен сетер:

public class Student { private int age; public void setAge(int age) { if (age  150) { throw new IllegalArgumentException(); } this.age = age; } }

5.3. Промяна на типа данни

Публичните полета, изменяеми или неизменяеми, са част от договора на клиента. По-трудно е да промените представянето на данни на тези полета в бъдещо издание, защото клиентите може да се наложи да рефакторират своите внедрения.

Чрез предоставяне на полета частен обхват и използване на достъп, ние имаме гъвкавостта да променим вътрешното представяне, като същевременно поддържаме и стария тип данни:

 public class Student { private StudentGrade grade; //new data representation public void setGrade(int grade) { this.grade = new StudentGrade(grade); } public int getGrade() { return this.grade.getGrade().intValue(); } }

Единственото изключение за използване на публични полета е използването на статични крайни неизменяеми полета за представяне на константи:

public static final String SLASH = "/";

6. Заключение

В този урок видяхме, че публичният модификатор се използва за дефиниране на API.

Също така описахме как прекалената употреба на този модификатор може да ограничи възможността за въвеждане на подобрения в нашето изпълнение.

Накрая обсъдихме защо е лоша практика да се използват публични модификатори за полета.

И както винаги, примерните кодове на тази статия са достъпни в GitHub.