Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it better to use getters or to access private members directly?

Which of the following is better? Is it even opinion-based or are there any relevant differences? Can one or the other be favored in some scenarios?

public class MyClass {
    private Integer myField;

    public void setMyField(Integer myField) {
        this.myField = myField;
    }

    public Integer getMyField() {
        return myField;
    }

}

I need a method to check wether something is allowed or not. Please, let's not talk about the sense of this code example. It's just a minimal example.

Implementation 1

public boolean isAllowed() {
    MyEnum.ALLOWED.getInt().equals(getMyField());
}

Implementation 2

public boolean isAllowed() {
    MyEnum.ALLOWED.getInt().equals(myField);
}

Edit: This post does not have an answer in the linked question (see comments to the initial post)

like image 470
Chris311 Avatar asked Dec 06 '16 12:12

Chris311


People also ask

Should getters be public or private?

In general, they should be public. If they are private they can only be called from within your class and, since you already have access to the private variables within your class, are redundant. The point of them is to allow access to these variables to other, outside, objects.

Should getters and setters be public or private?

Usually you want setters/getters to be public, because that's what they are for: giving access to data, you don't want to give others direct access to because you don't want them to mess with your implementation dependent details - that's what encapsulation is about.

Should getter methods be private?

The reason for declaring the getters and setters private is to make the corresponding part of the object's abstract state (i.e. the values) private. That's largely independent of the decision to use getters and setters or not to hide the implementation types, prevent direct access, etc.

Which choice is an advantage of using getters and setters?

Getters and setters allow the programmer to change the implementation of a class later on more easily. If the class is used elsewhere, and if there are no getters and setters, then the programmer has to change every other class which uses it.


1 Answers

Which of the following is better? Is it even opinion-based or are there any relevant differences? Can one or the other be favored in some scenarios?

It is question of good practice I think. The difference is in the readability of the code.

As a general rule, you should avoid indirection if not required. The current instance of MyClass has the information in one of these fields to implement the operation. It doesn't need to hide its internal state to itself.
So in internal, MyClass has no valuable reason to favor the use of the getMyField() over the direct use of the myField field.
The getMyField() accessor is more suitable to be used by clients of the class.
So I think that it is better in any case in your example code :

public boolean isAllowed() {
    MyEnum.ALLOWED.getInt().equals(myField);
}

Edit :
Beyond the readability, here is an example why you have no interest to couple the internal state to a public getter.
Suppose during the development phase you remove from the class the public getMyField() method because not need or not needed any longer for clients of the class, if isAllowed() relies on getMyField() in its implementation, it will be broken and you should replace it by myField.

like image 76
davidxxx Avatar answered Nov 14 '22 23:11

davidxxx