Simplify setter and getter of java class

I am trying to verify my understanding on setter and getter on java class with this example:

//MaximumFinder2.java

import java.util.Scanner;

public class MaximumFinder2
{
    public static void main (String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter three floating numbers separated by spaces: ");
        double num1 = input.nextDouble();
        double num2 = input.nextDouble();
        double num3 = input.nextDouble();

        maximum max = new maximum(num1, num2, num3);

        System.out.println(max.getMaximum(num1, num2, num3));
    } //end of main()
} //end of class Maximum Finder2

and the maximum class

//maximum.java
public class maximum
{
    private double maximumValue;
//    public double a, b, c;

    maximum(double a, double b, double c) 
    {
        this.maximumValue = getMaximum(a, b, c);
    }

    public double getMaximum (double a, double b, double c) 
    {
        return setMaximum (a, b, c);
    }

    public double setMaximum (double x, double y, double z)
    {
        double maxVal = x;

        if (y > maxVal)
            maxVal = y;

        if (z > maxVal)
            maxVal = z;

        return maxVal;
    }
} //end of maximum class

The code is working, but I am not sure how to simplify the code for all those local variables: double a, b, c and double x, y, z. I tried using global version of them, which was commented out, to make the class simpler, but did not work. Are those local variables necessary to make the maximum class?
Thanks a lot!

You don't need the local variable a,b,c, because all java functions pass primitive types by value (making a local copy of them). I would keep the same naming convention on setMaximum (calling the parameters a,b,c), because I see no reason to make it different from getMaximum and maximum. FInally I would get rid of maximum (not necessary), make setMaximum a void function (returns nothing) and decouple getMaximum from setMaximum (not calling setMaximum from inside it)and make it return maxVal instead of SetMaximum.

Edit. Another possible better solution would be to create a third function called calculateMaximum or something like that and put in it all the logic that it is currently in setMaximum. After it determines the greatest value it could call directly setMaximum that would have as it's only parameter the biggest value. In that case calculateMaximum would be void.
Or you can make it return the biggest value (in this case it won't be a void function), throw it in some variable and pass the variable as the argument for setMaximum, or be more direct and use determineMaximum as the argument of setMaximum, as it will return the maximum value that will be passed to setMaximum

Thanks colt!
I rewrote the code. Please comment on any mistake or improvement to get the "simplest" version of the code as I am still quite vague with your suggestions.

import java.util.Scanner;

public class MaximumFinder6
{
    public static class Maximum            
    {
        private double maximumValue;

        public void setMaximum (double x, double y, double z)
        {
            this.maximumValue = x;

            if (y > this.maximumValue)
                this.maximumValue = y;

            if (z > this.maximumValue)
                this.maximumValue = z;

        }  //End of setMaximum. This only set the maximumValue within the class,

        public double getMaximum ()
        {
            return this.maximumValue;
        }
    } //end of maximum class

    public static void main (String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter three floating numbers separated by spaces: ");
        double num1 = input.nextDouble();
        double num2 = input.nextDouble();
        double num3 = input.nextDouble();

        Maximum max = new Maximum();

        max.setMaximum(num1, num2, num3);
        System.out.println(max.getMaximum());

    } //end of main()
} //end of class MaximumFinder6

This version does not have the constructor with parameter I am learning.
What is the reason you said there is no need for the constructor here? Thanks!

Personally, when passing values to a constructor, I would expect it to be to pass values that probably won't be changed until the object's end of life. When thinking of setters and getters, it's usually to be expected to change values that change a certain number of times. So in this case I wouldn't bother to create a constructor just to do something that the getter and setter do fine. Would create one just to pass value that I expect won't change until the object reaches the end of his life.

But there is nothing wrong with what you did, it's fine if you want to use it.

1 Like

Thanks!
I wish I could catch the reasons behind your comments, which seems to me quite advanced. The original version did not use constructor at all and simply a function to do the same job. I believe I need dig into more of Java to get what you meant. Thank you again!

why the local variables though

In Java getters and setters are completely ordinary functions. The only thing that makes them getters or setters is convention. A getter for foo is called getFoo and the setter is called setFoo. In the case of a boolean, the getter is called isFoo. They also must have a specific declaration as shown in this example of a getter and setter for 'name':


[*]class Dummy {
[*]    private String name;
[*]    public Dummy() {}
[*]    public Dummy(String name) {
[*]        this.name = name;
[*]    }
[*]    public String getName() {
[*]        return this.name;
[*]    }
[*]    public void setName(String name) {
[*]        this.name = name;
[*]    }
[*]}

[/list]
The reason for using getters and setters instead of making your members public is that it makes it possible to change the implementation without changing the interface. Also, many tools and toolkits that use reflection to examine objects only accept objects that have getters and setters. JavaBeans for example must have getters and setters as well as some other requirements.

1 Like