Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Final attribute vs. a Private attribute with no Setter method in Java

Tags:

java

oop

In Java, I feel that using Private when declaring an attribute and not declaring a Setter method for it gives the same outcome as using Final when declaring the attribute, both allow the variable to stay constant.

If that is the case, what is the benefit of using Final in this scenario?

like image 585
Deyaa Avatar asked Feb 13 '26 12:02

Deyaa


2 Answers

Even without a setter other methods in the class can change the attribute so it's a completely different concept. Many would argue it's not a good thing to do (it adds "side effects" to your program) but it's still possible.

like image 53
John3136 Avatar answered Feb 16 '26 01:02

John3136


Assumed you are talking about variables, the keywords final and private define different characteristics.

The keyword final denies any changes to the variable and throws compilation errors when modified or changed. However, without specifying public or private, with the default package-private access modifier, it could be accessed by other classes in the same package once initialized (text with bold fonts are corrected by @charsofire and @MC Emperor).

On the other hand, the keyword private rejects the idea of being called by other classes, even in the same package. But it could be changed and modified by methods in the same class, even without setter or getter methods.

For example in the same class of the same package:

public class Student {
    private int score;

    final int id;

    public Student(int id, int score) {
        this.id = id;
        this.score = score;
    }

    public void modifyGrade(int newScore) {
        // Accepted
        this.score += newScore;
    }

    public void modifyID(int id) {
        // Rejected
        this.id = id;
    }
}

And in different class of the same package:

public class School {

    public static void main(String[] args) {
        Student student = new Student(0, 35);
        
        // Accepted
        System.out.println(student.id);
        // Rejected
        System.out.println(student.score);

        // Accepted
        student.modifyGrade(29);
        
        // throws exception
        student.id = 5;
        // Not visible
        student.score = 29;
    }    
}

Hope this answer helps you well,

and many thanks again to both @charsofire and @MC Emperor, who helped to clarify significantly in this answer.

like image 29
hokwanhung Avatar answered Feb 16 '26 01:02

hokwanhung