public Double squareRoot(Double d)
{
return new Double (Math.sqrt(d.doubleValue()));
}
What is the purpose of "return new"? Would it still work if "new" was removed?
public Double squareRoot(Double d)
{
return new Double (Math.sqrt(d.doubleValue()));
}
What is the purpose of "return new"? Would it still work if "new" was removed?
Yes, in fact you can remove even more code:
public Double squareRoot(Double d)
{
return Math.sqrt(d);
}
Even though Math.sqrt
returns a double
and not a Double
. This is done by a java feature called Autoboxing.
But as @assylias pointed out, you asked if it is ok to just remove the new
keyword. The answer to that is no. This does not compile:
public Double squareRoot(Double d)
{
return Double (Math.sqrt(d.doubleValue()));
}
The error is "Method call expected". You can't call a class' constructor as a method. You can only call a constructor by putting a new
keyword in front of it.
You are not using something called 'return new', instead, the following code:
return new Double (Math.sqrt(d.doubleValue()));
actually does
new Double (Math.sqrt(d.doubleValue()))
(which creates a new Double object with the value of Math.sqrt(d.doubleValue())
return
value of step 1Java also has a concept called autoboxing which allows for automatic conversion between objects of type Double
and values of the type double
. As result you don't need to explicitly create an object using new Double(...)
because Math.sqrt(...)
returns a value of double
. Java will do that automagically for you. Same applies to the parameter d
: you don't need to call doubleValue()
on it.
So you can change the code to:
public Double squareRoot(Double d) {
return Math.sqrt(d);
}
Or better yet use the primitive double
as an object of type Double
is not really necessary here:
public double squareRoot(double d) {
return Math.sqrt(d);
}
Or better yet (as forivall pointed out in comments to another answer) don't bother with this method and simply call Math.sqrt(...)
directly.
This new Double (Math.sqrt(d.doubleValue()));
involves converting a primitive type double
to its wrapper class Double
, and the other way round. But it's unnecessary. Instead, you can do return Math.sqrt(d)
, which is an example of both autoboxing and unboxing.
"Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an int to an Integer, a double to a Double, and so on. If the conversion goes the other way, this is called unboxing."
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Yes, it would still work (provided you also remove the brackets around Math.sqrt(d)
) - as long as you're using Java 5 or newer. That feature is called autoboxing / auto-unboxing, meaning the JVM will automatically wrap a primitive in it's corresponding wrapper type.
However, the disadvantage of writing return new Double(Math.sqrt(d))
is that is slightly less efficient. If you use return Double.valueOf(Math.sqrt(d))
(or just return Math.sqrt(d);
is that the first option will create a new Double
object, whereas the latter two options will try to re-use an earlier created Double
instance.
See the Double.valueOf()
Javadoc for details.