Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getter Pattern Within Class?

I have a field in a class that should only be accessed directly from a getter. As an example...

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());
  }
}

So even within the class itself a function like getFormattedCustomerInfo should not be able to access it via customerName_. Is there a way to enforce a class not access a field directly aside from the provided getter function?

like image 823
Coat Avatar asked Feb 25 '26 12:02

Coat


2 Answers

There is no such mechanism in Java (or at least I think there should not be). If you are sure that getFormattedCustomerInfo should be prohibited from direct access to customerName_, create another class and compose them.

I would recommend CustomerInfoFormatter.

Also, I would change customerName_ to customerName as the language supports privacy by explicit declaration and it is not needed to add more indicators.

like image 196
Marcin Natanek Avatar answered Feb 27 '26 01:02

Marcin Natanek


It looks like you are trying to cache the database value, and want to protect against accessing a value which has yet to be cached.

If this is true, then the variable customerName_ should not exist in the CustomerHelper class; the cached value should exist closer to the database.

The method customerDatabase.readCustomerNameFromId(customerId) should first look at a cache, and if the cache is empty, call the database and cache the result.

Effectively, customerName_ becomes a value in the cache: Map<Integer, String> cache where the key is customerId.

like image 43
Ian Mc Avatar answered Feb 27 '26 00:02

Ian Mc



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!