Какая польза от частной статической переменной в Java? - PullRequest
143 голосов
/ 02 сентября 2011

Если переменная объявлена ​​как public static varName;, то я могу получить к ней доступ из любого места как ClassName.varName. Мне также известно, что статические члены совместно используются всеми экземплярами класса и не перераспределяются в каждом экземпляре.

Объявление переменной как private static varName; отличается от объявления переменной private varName;?

В обоих случаях к нему нельзя получить доступ как ClassName.varName или как ClassInstance.varName из любого другого класса.

Придает ли объявление переменной статической другие специальные свойства?

Ответы [ 19 ]

108 голосов
/ 02 сентября 2011

Конечно, к нему можно получить доступ как ClassName.var_name, но только изнутри класса, в котором он определен, - потому что он определен как private.

public static или private static переменные часто используются для констант. Например, многие люди не любят «жестко кодировать» константы в своем коде; им нравится делать переменную public static или private static со значимым именем и использовать это в своем коде, что должно сделать код более читабельным. (Вы должны также сделать такие константы final).

Например:

public class Example {
    private final static String JDBC_URL = "jdbc:mysql://localhost/shopdb";
    private final static String JDBC_USERNAME = "username";
    private final static String JDBC_PASSWORD = "password";

    public static void main(String[] args) {
        Connection conn = DriverManager.getConnection(JDBC_URL,
                                         JDBC_USERNAME, JDBC_PASSWORD);

        // ...
    }
}

Сделаете ли вы это public или private, зависит от того, хотите ли вы, чтобы переменные были видны вне класса или нет.

91 голосов
/ 02 сентября 2011

Статические переменные имеют одно значение для всех экземпляров класса.

Если вы должны сделать что-то вроде:

public class Person
{
    private static int numberOfEyes;
    private String name;
}

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

44 голосов
/ 02 сентября 2011

Закрытые статические переменные полезны так же, как и закрытые переменные экземпляра: они хранят состояние, доступ к которому осуществляется только кодом в том же классе.Доступность (private / public / etc) и экземпляр / статический характер переменной являются полностью ортогональными понятиями.

Я бы не думал, что статические переменные являются общими для «всех экземпляров» класса, что предполагаетдля состояния должно быть как минимум один экземпляр.Нет - статическая переменная связана с самим типом, а не с любыми экземплярами типа.

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

Кроме того, я бы настоятельно рекомендовал, чтобы only Тип переменных, которые вы делаете открытыми (или даже не частными), являются константами - статическими конечными переменными неизменяемых типов.Все остальное должно быть приватным для разделения API и реализации (среди прочего).

8 голосов
/ 02 сентября 2011

Хорошо, вы правы: публичные статические переменные используются без создания экземпляра класса, а закрытые статические переменные - нет.Основное различие между ними и тем, где я использую частные статические переменные, заключается в том, когда вам нужно использовать переменную в статической функции.Для статических функций вы можете использовать только статические переменные, поэтому вы делаете их закрытыми, чтобы не получать к ним доступ из других классов.Это единственный случай, когда я использую приватную статику.

Вот пример:

Class test {
   public static String name = "AA";
   private static String age;

   public static void setAge(String yourAge) {
       //here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
       age = yourAge;
   }
}
8 голосов
/ 02 сентября 2011

Ну, переменные private static можно использовать для обмена данными между экземплярами этого класса.Хотя вы правы, мы не можем получить доступ к переменным private static, используя такие конструкции, как ClassName.member или ClassInstance.member, но член всегда будет виден из методов этого класса или экземпляров этого класса.Таким образом, экземпляры этого класса всегда могут ссылаться на член.

6 голосов
/ 20 июня 2016

Объявление переменной как private static varName; отличается от объявления переменной private varName;?

Да, оба они разные.И первый называется class variable, потому что он содержит одно значение для этого class, тогда как другой называется instance variable, потому что он может содержать другое значение для разных instances(Objects).Первый создается только один раз в jvm, а другой создается один раз для каждого экземпляра, т. Е. Если у вас есть 10 экземпляров, то у вас будет 10 различных private varName; в jvm.

Дает ли объявление переменной static другие специальные свойства?

Да, статические переменные получают некоторые свойства, отличные от обычных переменных экземпляра.Я уже упомянул немного, и давайте посмотрим некоторые здесь: class variables (переменные экземпляра, которые объявлены как статические) могут быть доступны напрямую, используя имя класса, например ClassName.varName.И любой объект этого класса может получить доступ и изменить его значение в отличие от переменных экземпляра, доступных только его соответствующим объектам.Переменные класса могут использоваться в статических методах.

Какая польза от private static variable в Java?

Логически, private static variable ничем не отличается от public static variable, скорее первый дает вам больше контроля,ИМО, вы можете буквально заменить public static variable на private static variable с помощью public static методов получения и установки.

Одна широко используемая область private static variable находится в реализации простого шаблона Singleton, где у вас будет только один экземпляр этого класса во всем мире.Здесь идентификатор static играет решающую роль, чтобы сделать этот единственный экземпляр доступным для внешнего мира (конечно, публичный статический метод получения также играет основную роль).

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}
5 голосов
/ 10 ноября 2013

Какая польза от закрытой статической переменной класса?

Допустим, у вас есть книга из библиотеки Class. Каждый раз, когда вы создаете новую книгу, вы хотите присвоить ей уникальный идентификатор. Один из способов - просто начать с 0 и увеличить номер идентификатора. Но как все другие книги узнают последний созданный номер? Просто сохраните его как статическую переменную. Должны ли покупатели знать, что действительный внутренний идентификационный номер для каждой книги? Нет. Эта информация является частной.

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}

Это надуманный пример, но я уверен, что вы легко можете вспомнить случаи, когда вы хотите, чтобы все экземпляры классов имели доступ к общей информации, которая должна быть конфиденциальной для всех остальных. Или даже если вы не можете, это хорошая практика программирования, чтобы сделать вещи максимально конфиденциальными. Что если вы случайно сделали это поле numBooks общедоступным, хотя пользователи Book не должны были с ним ничего делать. Тогда кто-то может изменить количество Книг, не создавая новую Книгу.

Очень подлый!

4 голосов
/ 28 марта 2014

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

2 голосов
/ 02 сентября 2011

Другая перспектива:

  1. Класс и его экземпляр - это две разные вещи во время выполнения.Информация о классе является «общей» для всех экземпляров этого класса.
  2. Нестатические переменные класса принадлежат экземплярам, ​​а статическая переменная принадлежит классу.
  3. Так же, как переменные экземпляра могут быть частными или общедоступными, статические переменные также могут быть частными или общедоступными.
1 голос
/ 23 ноября 2013

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

...