Может кто-нибудь показать мне случай, когда использование public в качестве модификатора доступа было бы «неправильным», а затем сделать то же самое с каждым модификатором? - PullRequest
3 голосов
/ 26 августа 2011

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

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

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

Ответы [ 7 ]

3 голосов
/ 26 августа 2011

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

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

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

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

2 голосов
/ 26 августа 2011

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

class CreditCard {
    private int number;

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

        number = nr;
        return true;
    }

    private Boolean checkNumber(int nr) {
        ...
    }
}
2 голосов
/ 26 августа 2011

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

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

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

1 голос
/ 26 августа 2011

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

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

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; }

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

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

1 голос
/ 26 августа 2011

Вы бы использовали 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!
0 голосов
/ 26 августа 2011

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

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

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

0 голосов
/ 26 августа 2011

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

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

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

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

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