Шаблон Геттера в классе? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть поле в классе, к которому следует обращаться только из геттера. Как пример ...

public class CustomerHelper {
  private final Integer customerId;
  private String customerName_ = null;

  public CustomerHelper(Integer customerId) {
    this.customerId = customerId;
  }

  public String getCustomerName() {
    if(customerName_ == null){
      // Get data from database.
      customerName_ = customerDatabase.readCustomerNameFromId(customerId);
      // Maybe do some additional post-processing, like casting to all uppercase.
      customerName_ = customerName_.toUpperCase();
    }
    return customerName_;
  }

  public String getFormattedCustomerInfo() {
    return String.format("%s: %s", customerId, getCustomerName());
  }
}

Таким образом, даже внутри самого класса функция, подобная getFormattedCustomerInfo, не должна иметь доступа к ней через customerName_. Есть ли способ заставить класс не обращаться к полю, кроме предоставляемой функции получения?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Похоже, вы пытаетесь кэшировать значение базы данных и хотите защитить от доступа к значению, которое еще не было кэшировано.

Если это так, то переменная customerName_ не должна существовать в классе CustomerHelper; кэшированное значение должно существовать ближе к базе данных.

Метод customerDatabase.readCustomerNameFromId(customerId) должен сначала посмотреть на кеш, а если кеш пуст, вызвать базу данных и кешировать результат.

Фактически customerName_ становится значением в кеше: Map<Integer, String> cache, где ключом является customerId.

0 голосов
/ 03 мая 2018

В Java такого механизма нет (или, по крайней мере, я думаю, что такого не должно быть). Если вы уверены, что getFormattedCustomerInfo должен быть запрещен прямой доступ к customerName_, создайте другой класс и составьте их.

Я бы порекомендовал CustomerInfoFormatter.

Кроме того, я бы изменил customerName_ на customerName, поскольку язык поддерживает конфиденциальность путем явного объявления, и добавление дополнительных индикаторов не требуется.

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