Java.awt中Dimension类的方法返回类型

10

看到heightwidth成员的getter方法返回类型是double,虽然它们是int,我感到非常惊讶。此外,接受double参数的setSize方法具有以下定义:

/**
 * 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);
}
请查看Dimension类。上面的评论说值不能超过Integer.MAX_VALUE。为什么? 为什么我们需要在中间使用double?是否有任何微妙的原因?请问有人能解释一下吗?对于我的坚持表示抱歉!
3个回答

4

java.awt.Dimension被改装以适应java.awt.geom包,因此它可以在需要Dimension2D的任何地方使用。后者的接口处理浮点数,所以Dimension也必须如此。由于只限于int字段,因此只能表示double的子集。Dimension2D.Float同样受到限制。


3
该类将 heightwidth 存储为 int,但提供了一个接受 double 的方法,因此您可以使用 double 值调用它(但它们会立即转换为 int)。该文件中还有其他接受 int 值甚至是 Dimension 对象的 setSize() 方法。由于这些值存储为 int,因此它们的最大值当然是 Integer.MAX_VALUE

1
就这样?我们为什么要使用返回类型为double的getter方法?有什么用处吗? - Ahamed
我不知道它们为什么返回双精度浮点数(可能是因为在谈论维度时,您正在谈论精度,而双精度浮点数在这些情况下更常用),但对于设置器来说,这只是一些方法重载以帮助用户。 - talnicolas
谢谢您的回复,我不认为double类型具有整数值会提高精度。我的意思是,double类型的1517.00等于1517,所以一定有某些原因吧? - Ahamed
@Ahamed 不是这样,我的意思是人们在处理尺寸时使用双精度值,并将getter的返回类型设置为double,以便用户不必在自己的端上进行转换。但就精度而言,我同意这没有什么用处。 - talnicolas
@Ahamed 我必须承认这很有趣,是个好问题。 - talnicolas

1
你可以使用Java的Dimension类和整数。如果你需要一个带有双精度宽度和高度的Dimension类,你可以使用以下代码:
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;
    }
}

你也可以扩展Dimension2D类,以便与其他Java函数保持兼容性。我在Kotlin中实现了类似的功能 https://gist.github.com/vladostaci/db4f601611879aa657403ff277324130 - vovahost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接