Java匿名类

时间:2013-04-04 15:22:20

标签: java

我对Java中的匿名类感到有点迷茫,我已经读过它们,但我怎么能使用这个类:

private abstract class CustomRectangle {
    protected final int width;
    protected final int height;
    protected final int xOffset;
    protected final int yOffset;
    protected final int borderSize;

    public CustomRectangle(final int width, final int height, final int xOffset, final int yOffset, final int borderSize) {
        this.width = width;
        this.height = height;
        this.xOffset = xOffset;
        this.yOffset = yOffset;
        this.borderSize = borderSize;
    }

    abstract void inBorder(final int dx, final int dy);

    abstract void outBorder(final int dx, final int dy);

    public void draw(Graphics2D g2d) {
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int dx = Math.min(x, width - 1 - x);
                int dy = Math.min(y, height - 1 - y);
                if (dx < borderSize || dy < borderSize) {
                    inBorder(dx, dy);
                }
                else {
                    outBorder(dx, dy);
                }
                g2d.drawLine(x + xOffset, y + yOffset, x + xOffset, y + yOffset);
            }
        }
    }
}

另一种方法是同时做以下事情:

  1. 扩展CustomRectangle以覆盖InBorder()和outBorder()
  2. 通过调用draw()方法绘制新的CustomRectangle。
  3. 必须有一种简单的方法可以做到这一点,我不想每次想要绘制一个CustomRectangle时都要制作大量的课程。

    帮助表示赞赏:)

    编辑包括解决方案:

        new CustomRectangle(CARD_DIMENSION.width, CARD_DIMENSION.height, 0, 0, 5) {
            @Override
            public void inBorder(final int dx, final int dy) {
                g2d.setColor(new Color(red, green, blue, 255 - Math.min(dx, dy)));
            }
    
            @Override
            public void outBorder(final int dx, final int dy) {
                g2d.setColor(new Color(red, green, blue, 192 - Math.min(dx, dy)));
            }
        }.draw(g2d);
    

    也许它看起来不那么漂亮,但它在我的应用程序设计中非常方便。

2 个答案:

答案 0 :(得分:7)

扩展CustomRectangle的匿名类的语法是:

CustomRectangle r = new CustomRectangle() {
    @Override
    public void inBorder(final int dx, final int dy) {
        // implementation
    }
    @Override
    public void outBorder(final int dx, final int dy) {
        // implementation
    }
}

另一种避免使用这些匿名类的方法是使用辅助对象参数化矩形类,以实现inBorderoutBorder。然后矩形类不必是抽象的;相反,它会将实现委托给辅助对象(可以在构造中或通过setter提供)。

答案 1 :(得分:0)

通过简单地定义需要类实例时所需的函数,可以使用匿名类扩展此抽象类。它看起来像这样:

CustomRectangle rect = new CustomRectangle() {
    @Override
    public void inBorder(final int dx, final int dy) {
        // Your implementation here.
    }
    @Override
    public void outBorder(final int dx, final int dy) {
        // Your implementation here.
    }
}

然后你可以简单地调用rect.draw()或者你需要的任何其他东西 - 它就像任何其他对象一样。