Java классы и методы Вопрос - PullRequest
2 голосов
/ 06 ноября 2010

Как человек, изучающий Java с нуля, который немного знает Python, мне было интересно, что со всеми модификаторами доступа (общедоступными, статическими, защищенными ...) в Java.Я знаю, что они имеют в виду, но зачем их использовать?

Это просто то, что меня беспокоит, потому что всякий раз, когда я пишу новый класс и пишу переменные экземпляра, я постоянно спрашиваю себя, хочу ли я, чтобы эта переменнаябыть частным, публичным, финальным и т. д.?Я обычно прихожу к выводу, что меня не волнует большинство переменных и методов.Есть несколько случаев, когда я знаю, что мне нужно будет вызывать метод из другого класса, но почему бы просто не сделать все методы открытыми?Это потому, что в больших проектах вы не можете доверять другому разработчику, который не собирается копаться и портить ваш код?

Ответы [ 5 ]

4 голосов
/ 06 ноября 2010

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

Методы могут быть:

  • private - если они используются только в текущем классе в качестве помощников.
  • защищен, если вы хотите, чтобы они были доступны только для подклассов, но не для других классов. Это когда вы разрабатываете свой класс для наследования и хотите предоставить хуки для подклассов.
  • package-private - если вы хотите использовать эти методы внутри одного и того же пакета, но не хотите показывать их внешнему миру

Все это относится к разработке API - какие функции вы хотите, чтобы ваш API представлял, а какие нет. То есть - какие методы являются внутренними для вашей реализации и какие должны использоваться классами, которые используют ваш класс для своей работы.

Преимущество всего этого заключается в том, что вы можете изменять приватные / приватно-пакетные методы, не полагаясь ни на кого, кроме своего собственного класса / пакета. Обнародование их связывает вас с их поддержкой. Это верно не только тогда, когда вы разрабатываете такой API-интерфейс, как инфраструктура коллекций. Это также верно, когда вы разрабатываете свой собственный API внутри вашего собственного проекта. Классы должны знать гораздо меньше методов (и, следовательно, их легче менять и поддерживать).

См. Эту презентацию Джошуа Блоха по разработке API (в частности, с 29:00)

0 голосов
/ 06 ноября 2010

Все зависит от того, какая часть вашего API выставлена, и, следовательно, сколько сломается, когда вы ее измените.

  • private код может быть изменен в любое время, и вы знаете, что вы будете влиять только на свой собственный код в этом одном файле.

  • по умолчанию (закрытый пакет), вы по-прежнему влияете только на свой собственный код (за исключением, возможно, некоторых хитростей пакета), но вам придется проверить его больше.

  • protected: код других людей может использовать его, но, поскольку он ограничен подклассами, они обычно могут довольно легко обновить свой код.

  • public может широко использоваться кодом других людей. Изменение этого параметра может заставить других людей изменять свой код на протяжении всего проекта. Если вы знаете, что ваш код используют другие люди, вам, вероятно, не стоит менять эти методы, пока вы не выпустите несколько версий, помеченных как @deprecated, чтобы у этих людей было возможность обновить свой код до его взлома.

0 голосов
/ 06 ноября 2010

Это, например, полезно, когда у вас есть библиотека, которую вы хотите иметь возможность обновлять без особых изменений в вашем коде.Публичные методы обычно остаются, в то время как частные могут измениться.Если автор библиотеки сделает все общедоступным, пользователи библиотеки могут случайно использовать такие методы реализации, что усложнит обновление библиотеки.

0 голосов
/ 06 ноября 2010

Это концепция ОО.Прежде всего, например, «final» - это модификатор, который сделает эту переменную «константой», а затем, если вам нужен constat, вы должны его использовать.Когда вы начнете кодировать реальные проекты, вы увидите преимущество такого типа инкапсуляции.Не недооценивайте это.

Например, когда вы кодируете метод, который может, например, измениться в будущем.

public void save(Person p){
    this.saveInTheDataBase(p);
}
private void saveInTheDataBase(Person p){
   database.save(p);
}
private void saveInFile(Person p){
   file.save(p);
}

Затем ваши клиенты будут вызывать save ();без заботы, где это спасено

0 голосов
/ 06 ноября 2010

Модификаторы доступа позволяют программистам программировать ОО-способом и использовать инкапсуляцию данных для написания герметичных (или максимально близких) API-интерфейсов.

Согласен, это не всегда желательно. Вот почему есть другие варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...