Может кто-нибудь показать мне случай, когда использование public в качестве модификатора доступа было бы "неправильным", а затем сделать то же самое с каждым модификатором?

Я пытался узнать больше о модификаторах доступа в java, и все говорили: "Используйте private, чтобы скрыть вещи, которые вы не хотите использовать другими классами / методами", и мне просто интересно, почему это нужно делать. Я не могу вспомнить ни одного случая, когда было бы целесообразно использовать private в качестве единственного разработчика...

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

Буду очень признателен за любую помощь в понимании этого, так как я все равно лучше учусь на программировании. Благодаря тонну!

7 ответов

Решение

Я не могу вспомнить ни одного случая, когда было бы целесообразно использовать private в качестве единственного разработчика...

Даже будучи единственным разработчиком, вы можете ошибаться, думайте о коде, который вы касаетесь / используете через месяцы после его написания. Использование правильных модификаторов доступа помогает с инкапсуляцией, структурированием кода и предотвращением ошибок (например, случайное изменение внутреннего состояния некоторого класса).

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

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

Один простой пример, почему вы хотели бы скрыть вещи:

class CreditCard {
    private int number;

    public Boolean setNumber(int nr) {
        if(!checkNumber(nr))
            return false;

        number = nr;
        return true;
    }

    private Boolean checkNumber(int nr) {
        ...
    }
}

Я думаю, что хороший способ найти примеры - это зайти в свой JDK, найти файл src.zip и начать просматривать исходный код. Я уверен, что вы найдете хорошие цитаты. Это может быть более значимым, чем все, что вы увидите здесь, и вы будете знать, что оно запущено в производство по всему миру.

Это также относится и к хорошим проектам с открытым исходным кодом (например, Spring).

Чтение хорошего кода других людей - отличный способ узнать о дизайнерских идеях.

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

Например, предположим, что в вашем классе есть элемент данных 'count', который должен обновляться только внутри вашего класса, объявите его закрытым, в противном случае может произойти что-то подобное:

class A
{
    public int count;
    public A()
    {
        count = 1;
    }
    public int divideByCount(int value)
    {
        return value/count;
    }
    public incrementCount()
    {
        count = count + 1;
    }
}

// somewhere else
example = new A();
example.count = 0;
example.divideByCount(4);   // Divide by zero!

Подумайте о переменных, которые контролируют состояние.

Допустим, у нас есть состояния для класса:

bool isDead = false;
bool isAlive = true;
bool canWalk = true;

void Kill() { isDead = true; isAlive = false; canWalk = false; }
void Resurrect() { isDead = false; isAlive = true; canWalk = true; }

Теперь состояния тесно связаны, и вы не хотите иметь возможность менять одно без другого.
Это ничего не значит, если вы оба живы и мертвы.

Поэтому вы хотели бы сделать переменные приватными, чтобы у вас не было доступа к их изменению. Вместо этого вы будете использовать функции, которые меняют состояние.

Вы должны использовать private модификатор, когда вам нужно, чтобы ваши члены, такие как атрибуты или методы, были доступны только текущему классу.

Выбор использования private Модификатор является задачей программиста.

Если программист не хочет, чтобы член класса не был доступен для других классов, потому что он может изменить состояние объекта (а программист не хочет, чтобы объект неожиданно изменил свое состояние), тогда он использует private,

Смотрите эту страницу для получения дополнительной информации о модификаторах доступа. Проверьте это и это тоже.

Даже отдельные разработчики будут использовать такие инструменты, как IDE и компилятор, чтобы помочь им в разработке.

Когда вы помечаете поле как частное, вы говорите, что не ожидаете, что это поле будет использоваться где-либо еще. Со временем вы можете вернуться к своему коду и забыть обо всех предположениях, которые вы могли сделать, когда впервые писали его. Если он стал публичным, но вы не разработали его таким образом, вы можете использовать его неправильно. Отмечая это как частное, вы гарантируете, что компилятор поможет вам сделать правильный выбор позже.

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

Другие вопросы по тегам