Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Help with cloning method

Tags:

java

I'm almost done with this project which involves converting between Celsius, Fahrenheit, and Kelvin and the last thing I need is to figure out the cloning method. The task is "clone, which takes no formal parameters and returns a reference to a newly created Temperature object that has the same value and scale as the object of which it is a clone ". My code compiles, but when run in the client program, i recieve an error of java.lang.StackOverflowError at Temperature.clone(Temperature.java:134)

public class Temperature {
    private double value;
    private String scale;

    public Temperature() { // default constructor 
        this.value = 0;
        this.scale = "C";
    }

    public Temperature(double value, String scale) {
        this.value = value;
        this.scale = scale;
    }

    public double getValue() {
        return this.value;
    }

    public String getScale() {
        return this.scale;
    }

    public double getCelsius() {

        if (scale.equalsIgnoreCase("C")) {
            return this.value;
        } else if (scale.equalsIgnoreCase("F")) {
            double faren = ((this.value - 32) * (5 / 9));
            return faren;
        } else {
            double kelvin = (this.value - 273.15);
            return kelvin;
        }
    } // end getCelcius

    public double getFaren() {
        if (scale.equalsIgnoreCase("F")) {
            return this.value;
        } else if (scale.equalsIgnoreCase("C")) {
            double celsius = ((this.value * 1.8) + 32);
            return celsius;
        } else {
            double kelvin = ((this.value * 1.8) - 459.67);
            return kelvin;
        }
    } // ene getFaren

    public double getKelvin() {
        if (scale.equalsIgnoreCase("K")) {
            return this.value;
        } else if (scale.equalsIgnoreCase("C")) {
            double celsius = (this.value + 273.15);
            return celsius;
        } else {
            double faren = ((this.value + 459.67) * (5 / 9));
            return faren;
        }
    } // end getKelvin

    public void setTemperature(Temperature t) {
        this.value = t.value;
    }

    public void setType(double degree, String measure) {
        this.value = degree;
        this.scale = measure;
    }

    public void setValue(double degree) {
        this.value = degree;
    }

    public void setScale(String measure) {
        this.scale = measure;
    }

    public double convertToCelsius() {
        this.scale = "C";
        return this.value = getCelsius();
    }

    public double convertToFaren() {
        this.scale = "F";
        return this.value = getFaren();
    }

    public double convertToKelvin() {
        this.scale = "K";
        return this.value = getKelvin();
    }

    public Temperature clone() {
        this.value = value;
        this.scale = scale;
        return clone();
    }
}

The cloning method is the last method, so any help would really be appreciated. I'm not sure where I'm going wrong! This is my first time using this website, so apologies for the formatting!

like image 683
Alex Moss Avatar asked Dec 28 '22 16:12

Alex Moss


1 Answers

I don't want to give you the answer to a homework project, that's frowned upon. However, the problems with your clone() method are hard to be... vague about.

public Temperature clone()

The method header looks great. You're returning a Temperature type, it's publicly accessible.

this.value = value;
this.scale = scale;

Do you know what the 'this' keyword does? It refers to the object that the method is called on. So, if I have a Temperature object 'a' and I want to call a.clone(), this will set a's value equal to... a's value.

return clone()

Here's the part that shows your big problem. What are you actually telling java to do here? You're telling it to return whatever the clone() method returns. Which means that clone will call itself, which will again call itself... on to stack overflow. This is a recursive loop that can't exit.

Remember, you want clone() to return a new Temperature object.

like image 65
Sam DeHaan Avatar answered Jan 13 '23 14:01

Sam DeHaan