2015-01-01 1 views
1

Здравствуйте, мне любопытно узнать, есть ли какая-либо цель сделать публичную переменную класса public в Java.Есть ли какая-либо цель сделать приватную переменную класса публичной?

public class XYZ { 

    public String ID; 
    public ABC abc; 

    private class ABC { 
     public boolean isExist; 
    } 
} 

Заранее благодарен.

ответ

1

Да, есть цель. Если вы это сделаете, то те элементы программы, которые могут получить доступ к классу, могут напрямую манипулировать этой переменной. В противном случае (скажем, если переменная является частной), эти элементы все равно смогут получить доступ к классу, но не смогут манипулировать переменной (если вы не предоставите для нее геттер/сеттер).

Подумайте об этом так: модификатор класса определяет уровень доступа к классу, тогда модификатор переменной определяет уровень доступа к самой переменной (для тех элементов, которые могут получить доступ к классу).

+0

Вы пытаетесь сказать, что сможете получить доступ к 'XYZ.abc.isExist' из другого класса? Это не правда. – shmosel

+0

@shmosel Нет, это не то, что я сказал. –

+0

Вы говорите, что если 'isExist' были закрытыми, он не был бы доступен из' XYZ'? Это тоже не так. – shmosel

2

То есть сделать isExist видным для класса XYZ.

Примечание. ABC видна только для XYZ, а не для каких-либо внешних классов, и ее переменная является общедоступной, поэтому вы можете иметь к ней доступ. private не означает для XYZ, только внешние классы

Изнутри XYZ,

ABC abc = new ABC(); //can only be accessed by XYZ. 
abc.isExists = true; //can only be accessed by XYZ 

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

private class ABC { 
    private boolean _isExist; //only through accessors 

    public boolean isExist() 
    { 
     return _isExist; 
    } 
} 
+0

Вы говорите, что если 'isExist' были закрытыми, он не был бы доступен из' XYZ'? Это не правда. – shmosel

1

Иногда это делается для только данных классов. Например, это иногда делается для представления моделей, хранящихся в базах данных (см. Objectify для реального примера того, как это используется вместе с аннотациями для представления моделей баз данных, которые хранятся в базе данных App Engine).

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

0

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

THING # 1: Держите ваш переменный экземпляр конфиденциальными. Затем вы получите общедоступные методы getter и setter и установите значение этой переменной. Хорошая вещь в том, что вы можете поставить чеки внутри метода setter. Например, длина никогда не может быть отрицательной. Таким образом, вы не можете просто сделать длину публичной, и пусть кто-то присваивает ей любое значение, которое они хотят. Вы должны убедиться, что назначенное ему значение не является отрицательным. Итак:

class myClass { 
    private int length; 

    public void setLength(int i) { 
     if (i > 0) { 
      length = i; 
     } 
    } 
} 

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

THING # 2: Если вам не нужны какие-либо ограничения на значение переменной экземпляра, и вы хотите, чтобы он не был доступен только для чтения и не был написан только для записи, то это прекрасно, чтобы сохранить эту переменную общедоступной.Например: дети могут иметь любое имя - без ограничений:

class Baby { 
    public name; 
} 

class Mother { 
    public void nameTheBaby() { 
     Baby baby = new Baby(); 
     baby.name = "Sarah"; 
    } 
}