2016-04-15 2 views
0

При работе в intelliJ мне рекомендовали локализовать метод - удалив модификатор доступа. Я понял, что на самом деле я не знаю, какой модификатор использовать, а когда и хотел бы прояснить.Когда использовать локальный модификатор доступа?

Я прочитал этот пост: What is the difference between Public, Private, Protected, and Nothing?

и, как это для C#, хотя они похожи, я хотел убедиться, что это не слишком отличается.

Я также читал Javadoc пост здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

и был все еще немного скептически.

Спасибо!

+1

Использовать конфиденциально, где это возможно. Использование защищено только в том случае, если вы явно проектируете для наследования. Ничто (пакет) не позволяет другим классам в одном пакете вызывать метод, но не классы в другом пакете. Публика, конечно, позволяет кому-либо ее вызывать. Используйте общественность экономно. – KevinO

+0

@neferpitou это действительно просто копия диаграммы в [link] (https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html). Мне было любопытно, есть ли лучший способ объяснить это. – primelf

+0

Спасибо, @KevinO помогло мне это разъяснить. Означает ли это, что публичный метод можно легко изменить изнутри основного или другого класса? – primelf

ответ

3

Модификаторы доступа помогают с принципом инкапсуляции ООП. Если вы создадите хорошо написанный класс, любой сможет использовать его, не зная всех внутренних деталей того, как он работает. Когда вы определяете метод как открытый, любой код, который использует ваш класс, будет иметь доступ к этому методу. Вы хотите только разоблачить методы, которые потребует конечный пользователь вашего класса. Если это вспомогательный метод, который делает некоторые внутренние вычисления релевантными только внутри вашего класса, объявите его закрытым. Он сократит методы, доступные конечному пользователю, и сделает ваш класс намного проще в использовании. Вот пример:

Public Class Car { 
    private int speed; 
    private float fuelNeeded; 
    private float afRatio = 14.7; 

    public void speedUp { speed++; } 

    public void speedDown { speed--; } 

    public float getFuelNeeded { 
     calculateFuelNeeded(speed); 
     return fuelNeeded; 
    } 

    private void calculateFuelNeeded (int speed) { 
     // Do some complex calculation 
     fuelNeeded = someValue/afRatio; 
    } 
} 

Тот, кто создает объект Car будет иметь три метода доступны, SpeedUp, speedDown и getFuelNeeded. calculateFuelNeeded используется только внутри класса, поэтому нет никаких причин для его просмотра. Таким образом, им не нужно знать, как рассчитывается сумма, или когда нужно вызвать метод, или какие значения он устанавливает внутри. Они легко получают значение с помощью getFuelNeeded();

При объявлении переменных обычно всегда правильно объявлять их частными, с общедоступными методами get() и set() для любых, к которым необходимо получить доступ извне класса. Основная причина этого - запретить внешнему пользователю устанавливать значение что-то недействительное. В нашем классе Car afRatio должен быть отличным от нуля, потому что мы используем его как делитель. Если мы объявим его как общественность, пользователь может легко написать этот код:

Car car = new Car(); 
car.afRatio = 0; 
someFloat = car.getFuelNeeded(); 

Конечно, это вызвало бы наш класс бросить ArithmeticException для дивизия нуля. Однако, если бы мы сделали это:

private afRatio = 14.7; 

public void setAfRatio(float ratio) { 
    if(ratio <= 0) 
     throw new IllegalArgumentException("A/F ratio must be greater than zero"); 
    afRatio = ratio; 
} 

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

Смежные вопросы