2012-02-28 23 views
8

Jestem zaskoczony, aby zobaczyć, że getters z height i width członków ma return typ double, aczkolwiek są one int. Ponadto setSize metoda z podwójnym parametrów ma następującą definicję:Metoda typ zwracany w klasie wymiar java.awt

/** 
* Sets the size of this <code>Dimension</code> object to 
* the specified width and height in double precision. 
* Note that if <code>width</code> or <code>height</code> 
* are larger than <code>Integer.MAX_VALUE</code>, they will 
* be reset to <code>Integer.MAX_VALUE</code>. 
* 
* @param width the new width for the <code>Dimension</code> object 
* @param height the new height for the <code>Dimension</code> object 
*/ 
public void setSize(double width, double height) { 
    this.width = (int) Math.ceil(width); 
    this.height = (int) Math.ceil(height); 
} 

Proszę spojrzeć na Dimension klasie. Powyższy komentarz mówi, że wartości nie mogą przekroczyć wartości Integer.MAX_VALUE. Czemu? Dlaczego mamy między sobą double? Czy istnieje jakiś subtelny powód? Czy ktoś może mi to wyjaśnić? Przepraszam za moje naleganie!

Odpowiedz

3

java.awt.Dimension został doposażony w pakiet java.awt.geom, dzięki czemu można go używać wszędzie tam, gdzie wymagany jest Dimension2D. Interfejs dla późniejszych zajmuje się zmiennoprzecinkowym, więc Dimension musi również. Będąc ograniczone do pól int, może być reprezentowany tylko podzbiór double s. Dimension2D.Float jest podobnie ograniczony.

3

Klasa jest przechowywanie height i width jako int, to właśnie jest sposób, że akceptują podwójne też tak można nazwać to z wartościami podwójnych (ale są one natychmiast rzucać int). W tym pliku istnieją inne metody, które akceptują wartości int, a nawet obiekt Dimension.

I ponieważ te wartości są przechowywane jako int, ich maksymalna wartość wynosi Integer.MAX_VALUE.

+1

To wszystko? Dlaczego mamy gettery z 'double' jako' return' type? Dowolne użycie? – Ahamed

+0

Nie znam dokładnego powodu, dla którego zwracają się dwukrotnie (prawdopodobnie dlatego, że gdy mówimy o wymiarach, mówimy o precyzji i podwójności jest częściej używany w tych przypadkach), ale dla seterów jest to po prostu przeciążenie metody do pomóc użytkownikowi. – talnicolas

+0

Dziękuję za odpowiedź, nie sądzę, że 'double's o wartości int pomoże w precyzji. Mam na myśli podwójne 1517.00 równe 1517, więc musi być jakiś powód? – Ahamed

0

Możesz używać klasy wymiaru java z ints. Jeśli potrzebujesz klasy Dimension o podwójnej szerokości i wysokości, możesz użyć następującego:

public class DoubleDimension { 
    double width, height; 

    public DoubleDimension(double width, double height) { 
     super(); 
     this.width = width; 
     this.height = height; 
    } 

    public double getWidth() { 
     return width; 
    } 

    public void setWidth(double width) { 
     this.width = width; 
    } 

    public double getHeight() { 
     return height; 
    } 

    public void setHeight(double height) { 
     this.height = height; 
    } 

    @Override 
    public String toString() { 
     return "DoubleDimension [width=" + width + ", height=" + height + "]"; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     long temp; 
     temp = Double.doubleToLongBits(height); 
     result = prime * result + (int) (temp^(temp >>> 32)); 
     temp = Double.doubleToLongBits(width); 
     result = prime * result + (int) (temp^(temp >>> 32)); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     DoubleDimension other = (DoubleDimension) obj; 
     if (Double.doubleToLongBits(height) != Double.doubleToLongBits(other.height)) 
      return false; 
     if (Double.doubleToLongBits(width) != Double.doubleToLongBits(other.width)) 
      return false; 
     return true; 
    } 
} 
Powiązane problemy