Is a public setter necessary for a private static variable?

/* Atleast is it needed in this case?*/
 public class Service
{       
         private static List<String> subscribedFields;
    private static List<String> unsubscribedFields;
         //---------------------------------  
         // is this necessary?
         //---------------------------------
    public static void setFields(List<String> subscribedFields, List<String> unsubscribedFields)
    {
        Service.subscribedFields = subscribedFields;
        Service.unsubscribedFields = unsubscribedFields;
    }
    public static List<String> getSubscribedFields()
    {
        return subscribedFields;
    }
    public static List<String> getUnsubscribedFields()
    {
        return unsubscribedFields;
    }
}
// some other class
public class User{
     // Is this not enough to change the lists? Isn't the setter redundant? 
     Change(Service.getSubscribedFields());
     Change(Service.getUnsubscribedFields());

}
+3
source share
4 answers

No, a public setter is not always needed for a private variable. The idea of ​​providing public setters (and getters, for that matter) is based on what external objects, such as classes, need access to the internals of the specific code that you write. Getters and seters provide this open interface for this. However, you do not have to provide a public getter or setter for each private variable that you create, as this private variable can exist only for internal, private use in the class.

, .

( - getter, ). , . , , ( , , , , ..), . , getSubscriptionFields() , :

// Pseudocode
public String getSubscribedField(int i) {
  return subscribedFields.Get(i);
}

public String addSubscribedField(String field) {
  subscribedFields.Add(field);
}

, .

+6

Singleton, . , , , . , . , , , , , , .

, .

+1

, . .

+1

, , . List .

, JavaBeans getters, , .

. , , .

, Spring Guice, , , , .

    public class SubscriptionServiceUsingDependencyInjection {

    private final Set<String> subscribedFields = new CopyOnWriteArraySet<String>();

    public boolean isSubscribed(String field_) {
        return subscribedFields.contains(field_);
    }
    public void subscribe(String field_) {
        subscribedFields.add(field_);
    }
}

, :

    public enum SubscriptionServiceUsingASingleton {
    INSTANCE;
    private final Set<String> subscribedFields = new CopyOnWriteArraySet<String>();

    public boolean isSubscribed(String field) {
        return subscribedFields.contains(field);
    }
    public void subscribe(String field) {
        subscribedFields.add(field);
    }
}

CopyOnWriteArraySet will prevent the concurrency issue if you use it in a multi-threaded environment.

+1
source

Source: https://habr.com/ru/post/1789777/


All Articles