Results 1 to 12 of 12
  1. #1
    kyameron is offline Member
    Join Date
    Nov 2010
    Posts
    9
    Rep Power
    0

    Default Formulas in methods or constructors?

    Hi all. I've just started learning how to program and I have some very basic questions that I would be grateful if anyone could answer for me.

    So, in my Java textbook there is a problem that asks me to implement a class that accepts the diameter and height of a cylinder in its constructor and has two methods that find volume and surface area, respectively. The class was actually very easy to implement but I checked the website for my textbook that has solutions to selected exercises and their answer was slightly different than mine.

    Namely, they had used volume and surface area as their instance variables whereas I had used radius and height. Also, I had defined volume and surface area within my methods that returned volume and surface area where they had defined volume and area within the constructor. i.e. their getSurfaceArea method simply returned surface area.

    My questions are, was the book's program more efficient or sound than mine? What exactly does it matter what you define as an instance variable and is it better to create formulas (in this case mathematical formulas) in a constructor?

  2. #2
    al_Marshy_1981 is offline Senior Member
    Join Date
    Feb 2010
    Location
    Waterford, Ireland
    Posts
    748
    Rep Power
    5

    Default

    post your code please

  3. #3
    kyameron is offline Member
    Join Date
    Nov 2010
    Posts
    9
    Rep Power
    0

    Default

    My code:

    public class SodaCan
    {
    public SodaCan(double h, double d)
    {
    radius = d/2;
    height = h;
    }
    public double getVolume()
    {
    double volume = PI * radius * radius * height;
    return volume;
    }
    public double getSurfaceArea()
    {
    double surfaceA = (2 * PI * radius * radius) + (2 * PI * radius * height);
    return surfaceA;
    }
    final double PI = Math.PI;
    private double radius;
    private double height;
    }

    Book's code:

    public class SodaCan
    {
    public SodaCan(double aHeight, double aDiameter)
    {
    double height = aHeight;
    double diameter = aDiameter;
    double radius = diameter / 2;
    volume = Math.PI * Math.pow(radius, 2) * height;
    surfaceArea = 2 * Math.PI * radius * height;
    }

    public double getVolume()
    {
    return volume;
    }

    public double getSurfaceArea()
    {
    return surfaceArea;
    }

    double volume;
    double surfaceArea;
    }

  4. #4
    al_Marshy_1981 is offline Senior Member
    Join Date
    Feb 2010
    Location
    Waterford, Ireland
    Posts
    748
    Rep Power
    5

    Default

    Does your program do what you want it to do? or does it do what the textbook says to do? more importantly have you learned either way about classes, I do not care either way long as you know how classes work...Most important thing is you learned how classes work (assuming this is your chapter).

  5. #5
    al_Marshy_1981 is offline Senior Member
    Join Date
    Feb 2010
    Location
    Waterford, Ireland
    Posts
    748
    Rep Power
    5

    Default

    back to your final question In my opinion the efficiencty is neglible, but you might get better answers. Better to code the way you feel and know what is going on than code blind from a book so I would say keep doing it your own way. you will learn more. hope this is helpful.

  6. #6
    kyameron is offline Member
    Join Date
    Nov 2010
    Posts
    9
    Rep Power
    0

    Default

    OK, thank you for your help.

  7. #7
    al_Marshy_1981 is offline Senior Member
    Join Date
    Feb 2010
    Location
    Waterford, Ireland
    Posts
    748
    Rep Power
    5

    Default

    Efficiency should always be the last thing on your mind, make the thing work first, then you can review, that is my own personal opinion and I doubt anybody here will disagree.

  8. #8
    pbrockway2 is offline Moderator
    Join Date
    Feb 2009
    Location
    New Zealand
    Posts
    4,565
    Rep Power
    12

    Default

    was the book's program more efficient or sound than mine?

    Both programs are sound in the sense that they will both give correct output in any test of the getXXX() methods.

    It's not really possible to answer the question about efficiency since that depends on the context within which the class is used. If a program created zillions of soda cans but very rarely wanted to know about their surface area, it would seem a waste of time to calculate that value in the constructor. But if a program were making a great many lists of cans and wanted them sorted by volume then it would be sensible perhaps to do the calculation once and for all when the can was constructed.

    Since, in the case you are considering, there is no context (it's just a textbook question) then there is no answer. For what it's worth I would have written the class the way you did.

    I'll risk al_Marshy_1981's (and others') disapproval by disagreeing, well, just a little bit. It's good to note a difference of approach. And it's good to wonder why. If you agree with my observation that it matters how often the getters will be called then, facing this situation in the future, you would choose from the possible approaches that which is most appropriate.

    Even then efficiency wouldn't be the first thing on your mind: soundness would be. Followed by less easily definable things like "simplicity", "clarity", "elegance" etc. My disagreement is limited to thinking that it needn't be the last thing on your mind either.

    (Writing this, it occurs to me that our minds don't really work like that: from first to last. Sometimes ideas just hang about in the background rather than standing regimented in line. Efficiency might be like that: never driving the process but always lurking as a question and suggesting possibilities.)

    If volume and surface area were really expensive to calculate (which they aren't) "efficiency" might raise its head from the programming book it's reading to suggest something like:

    Java Code:
    public class SodaCan
    {
       private double volume = -1;
       private double surfaceArea = -1;
       private double radius;
       private double height;
    
       public SodaCan(double height, double diameter)
       {
          this.height = height;
          radius = diameter / 2;
       }
    
       public double getVolume()
       {
          if(volume < 0) 
          {
             volume = Math.PI * radius * radius * height;
          }
          return volume;
       }
    
       public double getSurfaceArea()
       {
          if(surfaceArea < 0)
          {
             surfaceArea = 2 * Math.PI * radius * height;
          }
          return surfaceArea;
       }
    }

  9. #9
    kyameron is offline Member
    Join Date
    Nov 2010
    Posts
    9
    Rep Power
    0

    Default

    Thank you for your reply! I guess I asked the question about efficiency because the textbook mentioned it a few times but I'm just trying to get as in-depth an amount of knowledge about Java, and I guess programming in general, that I possibly can. If I just get a program to run, that's not as valuable to me as knowing why it successfully ran. Along those lines...

    I did another exercise in the book which was more difficult for me than the soda can one and I think my question here will have a more straightforward answer.

    The problem from the book:

    Implement a class Balloon that models a spherical balloon that is being filled with air. The
    constructor constructs an empty balloon. Supply these methods:
    void addAir(double amount) adds the given amount of air
    double getVolume() gets the current volume
    double getSurfaceArea() gets the current surface area
    double getRadius() gets the current radius

    My answer:

    public class Balloon
    {
    public Balloon()
    {
    volume = 0;
    }
    public void addAir(double amount)
    {
    volume += amount;
    radius = Math.sqrt(volume / (4 * PI));
    }
    public double getVolume()
    {
    return volume;
    }
    public double getSurfaceArea()
    {
    double surfaceA = 4 * PI * radius * radius;
    return surfaceA;
    }
    public double getRadius()
    {
    return radius;
    }
    final double PI = Math.PI;
    private double volume;
    private double radius;
    }
    Tester class:

    public class BalloonTester
    {
    public static void main(String[] args)
    {
    Balloon balloon = new Balloon();

    balloon.addAir(1300);
    System.out.println(balloon.getSurfaceArea());
    }
    }

    This code seems to work well, but when I started out I tried to put my radius = Math.sqrt(volume / (4 * PI)) expression in the constructor. Then I tried to put it in the getRadius method. In both cases the program returned 0.0 for getSurfaceArea. Ultimately it only worked when I put the expression in the addAir method, as it is now. I can only hypothesize that the reason has to do with the explicit parameters of the constructors and methods. In SodaCan I could write out formulas in the constructor and they would be carried over to all of the methods. Since my Balloon constructor has no explicit parameters, it kept reading volume as 0.0. In addAir, conversely, "amount" is the explicit parameter which modifies volume each time air is added, so "volume" in my formula is correctly used in my formula to find radius. Am I right or is something else wrong in my code?

    Sorry for all my questions.

  10. #10
    pbrockway2 is offline Moderator
    Join Date
    Feb 2009
    Location
    New Zealand
    Posts
    4,565
    Rep Power
    12

    Default

    Yes I think you've got the right idea.

    In SodaCan height/radius are being set in the constructor and volume/surface area are being calculated. (It doesn't matter much where they are calculated as you found.) Height and radius totally describe the can while volume and surface area need to be calculated. Height and radius make up the state of the can.

    In Balloon things are a little different. Either the volume or the radius could be used to totally describe the balloon (that is either can be calculated from the other) but you have decided to have both as instance variables. That's fine, but when one changes you must be sure to change the other. That is you must keep the state consistent. This is only an issue for the balloon because the state of the can never changed.

    The place where the balloon changes state is the addAir() method. So that is where you must keep the state consistent by calculating the radius ready to be used in either getRadius() or getSurfaceArea(). More jargon: addAir() is known as a mutator method because it alters the state of the balloon and a typical task of a mutator method is to keep the state consistent as you do by recalculating the radius.

    -----------------

    A little point: the volume of a sphere (which is the shape of balloons in textbooks) is (4/3)*pi*r^3. So if you know the volume V the radius r will be given by r=cube_root(3*V/(4*pi)). Whereas you have r=sq_root(V/(4*pi)).

    I don't know if the Math class offers a cube root. You will have to look that up in the Math API docs and/or get creative.

  11. #11
    Iron Lion is offline Senior Member
    Join Date
    Nov 2010
    Posts
    210
    Rep Power
    4

    Default

    Math.cbrt() exists, but for the fourth root (for example) you could do Math.pow(x, 0.25).

  12. #12
    JosAH's Avatar
    JosAH is offline Moderator
    Join Date
    Sep 2008
    Location
    Voorschoten, the Netherlands
    Posts
    13,335
    Blog Entries
    7
    Rep Power
    20

    Default

    Quote Originally Posted by Iron Lion View Post
    Math.cbrt() exists, but for the fourth root (for example) you could do Math.pow(x, 0.25).
    Not that it matters much here, but I like this implementation.

    kind regards,

    Jos
    cenosillicaphobia: the fear for an empty beer glass

Similar Threads

  1. Replies: 8
    Last Post: 04-16-2012, 11:00 PM
  2. Need help with constructors
    By tpfaff in forum New To Java
    Replies: 10
    Last Post: 10-22-2010, 04:33 AM
  3. Calling subclassed methods from constructors
    By arefeh in forum New To Java
    Replies: 7
    Last Post: 01-22-2010, 12:22 AM
  4. constructors?
    By shroomiin in forum New To Java
    Replies: 4
    Last Post: 10-13-2009, 02:14 PM
  5. Constructors
    By new2java2009 in forum New To Java
    Replies: 5
    Last Post: 08-18-2009, 06:46 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •