2016-11-22 2 views
2

Рекомендуется использовать модификаторы общедоступного доступа для полей данных в конечном (неизменяемом) классе java, даже если поля данных не являются ссылками на изменяемый тип данных. Или мы будем обращаться к полям данных непосредственно, поскольку поля данных должны быть определены в самом конструкторе, поэтому свести на нет все шансы изменить внутреннее представление класса. Пожалуйста, предложите?Модификаторы доступа в Java при использовании с неизменяемым классом

Например:

public class MainApp { 

    public static void main(String args[]) { 

     Immutablesample immutablesample = Immutablesample.getInstance("akkhil"); 

     System.out.println(" Before modification " + immutablesample.getName()); 
     immutablesample.name = "gupta"; 
     System.out.println(" After modification " + immutablesample.getName()); 
    } 

} 

является вызывающий код пытается изменить поле данных путем доступа к нему напрямую (без модификатора доступа) для следующего класса:

public final class Immutablesample { 


    private final String name; 

    private Immutablesample(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public static Immutablesample getInstance(String name){ 
     return new Immutablesample(name); 
    } 
} 

Как бы это сделать класс, подверженный изменению внутреннего представления, если я изменяю модификатор от частного к публичному private String name; к публичному имени строки; , поскольку объект создавал с параметризованным конструктором, поэтому имеет неизменяемые поля данных, чем нужно, чтобы частные поля данных были приватными?

+1

Можете ли вы разместить пример или два? Ваш недостаток в использовании пунктуации и правильной терминологии затрудняет понимание вопроса. –

+0

вы можете найти здесь все подробности: https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html – grsdev7

+0

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

ответ

2

Два простых правила следовать:

  1. Попробуйте сделать весь свой класс как «неизменное», как вы можете. Например, установка частных окончательных полей только через конструкторы. И при использовании «входящих» объектов коллекции подумайте о том, чтобы создать копию их содержимого, чтобы быть действительно в безопасности.
  2. Имейте в виду, что хороший OO об обнажении Поведение; не об обнажении данные. Значение: вы абсолютно делаете не хотите сделать поля общедоступными, если у вас нет действительно веских оснований для этого. Другими словами: вы делаете не хотите, чтобы какой-то другой класс B что-то сделал из-за содержимого какого-либо поля в классе A. И способ предотвратить это: сделать ваши поля частными!
1

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

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