Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Java Java Objects Harnessing the Power of Objects Filling the Dispenser

Stephen Crispini
PLUS
Stephen Crispini
Courses Plus Student 619 Points

Why make MAX_PEZ public, but characterName private?

I recall that we made characterName private so that it couldn't be directly accessed or changed (we don't want Yoda becoming Vader after all). But it seems like setting MAX_PEZ to public and final accomplishes this too: it can have a variable assigned to it once and then that can't be changed, but it's directly accessible. So I guess I'm curious why characterName should be private, since it then requires an additional method "GetCharacterName" to return the name versus saying return characterName right?

3 Answers

andren
andren
28,558 Points

The reason why characterName is not simply declared with public is that at a later point in this course you will actually be removing the final keyword and adding a method to the class that does end up changing the characterName field. In order to force a user to only change the field by calling that method the field has to be private.

Making a field private and then adding one method to get the field and one method to set the field (often referred to as a getter and a setter) is an extremely common design pattern. It is an example of Encapsulation which is often considered to be a fundamental part of object-oriented programming.

Part of the advantage it holds over just making the field public is that it gives you control over what happens when the field is accessed and control over what happens when it is changed. As well as the ability to control what values the field is changed to. And that means you don't have to worry about a field suddenly having it's value changed at a time or in a way that the class was not designed to handle.

Edit: Changed some of this post as I had misremembered a part of this course.

Stephen Crispini
Stephen Crispini
Courses Plus Student 619 Points

Ooh okay that makes a lot more sense to me now! Whereas the MAX_PEZ will remain a constant, so there's no need to wall it off because it is set in stone once and will never be changed.

I think I was confused because earlier in the lesson, he talked about the characterName as if it would be set once and never changed again. Hadn't thought about the fact that further functionality would be added down the line that would change that. Thanks so much.

Yanuar Prakoso
Yanuar Prakoso
15,196 Points

Hi Stephen..

The shortest answer for your case is: the key is in the final word in the public final for MAX_PEZ constant. Since MAX_PEZ is a constant the value will be fixed through out the program when it runs. However, characterName is a variable which the user of your program will decide who will be the characterName of their own Pez. If you coose to use public final on characterName variable your users will not be able to change this as they wanted.

You mentioned the getCharacterName method in your question, which commonly known in Java programming as getter method. In pair with the getter it was obvious there will be setter method. In your case the setter is in the construction method with this.characterName variable which received the characterName value chosen by user when it called PezDispenser class. You must give characterName right when you call the new PezDispenser class right. If the characterName variable is set to be public final you will not be able to do this.

I guess you already familiar with encapsulation and/or abstraction features and what it importance for best practice in object oriented programming since you mentioned "you do not want anyone to change the characterName". That is exactly why need to make variables private unless it is really needed to be public. The encapsulation will avoid any user to make mistakes inputting values that will crash the program. When user input something it must be validated and also when the user ask to get something it must also be validated that is what getter and setter method is for actually. You will learn this more in the future courses in Java.

I hope this will help. Any further addition to the explanation will be much appreciated. Keep on coding. If you had more question on this just post it more.

Steven Vallarsa
seal-mask
.a{fill-rule:evenodd;}techdegree
Steven Vallarsa
Full Stack JavaScript Techdegree Student 14,699 Points

I too was puzzled by why MAX_PEZ was public. After some thought I'm guessing it's public so it can be referenced directly from anywhere else in the project since it's not a secret number. I see no reason it couldn't be private with a public getter (with no setter since it's final and can't be changed), apart from the extra method that is required.