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.
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!
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':
[/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.