Java匿名类

Java匿名类,java,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;

我对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);
            }
        }
    }
}

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

扩展
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
    }
}

避免使用这些匿名类的另一种方法是使用helper对象参数化矩形类,以实现
inBorder
outBorder
。这样矩形类就不必是抽象的;相反,它将把实现委托给helper对象(可以在构造时提供,也可以通过setters提供)。

扩展
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
    }
}

避免使用这些匿名类的另一种方法是使用helper对象参数化矩形类,以实现
inBorder
outBorder
。这样矩形类就不必是抽象的;相反,它会将实现委托给helper对象(可以在构造时提供,也可以通过setter提供)。

您可以使用匿名类扩展这个抽象类,只需在需要类的实例时定义所需的函数即可。看起来是这样的:

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()
或您需要的任何其他对象--它是一个与其他对象类似的对象。

您可以使用匿名类扩展这个抽象类,只需在需要类的实例时定义所需的函数即可。看起来是这样的:

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()
或者你需要的任何东西——它是一个像其他任何对象一样的对象。

你根本不清楚第2点是什么意思。您需要在什么点绘制矩形?你真的需要创建那么多不同的边界绘制方法吗?你能不能改为数据驱动,例如,将边框宽度作为一个参数?这不是关于边框宽度,而是关于我想对不同矩形的每像素分配的颜色进行不同的处理(在内边框和外边框上也不同)。当我构造这个匿名类的时候,我想立即画出这个矩形。那么你不能只构造匿名类的实例,然后调用draw吗?你根本不清楚第2点是什么意思。您需要在什么点绘制矩形?你真的需要创建那么多不同的边界绘制方法吗?你能不能改为数据驱动,例如,将边框宽度作为一个参数?这不是关于边框宽度,而是关于我想对不同矩形的每像素分配的颜色进行不同的处理(在内边框和外边框上也不同)。当我构造这个匿名类时,我想立即绘制矩形。那么你不能只构造匿名类的实例,然后调用draw吗?使用了你的解决方案,效果很好:)编辑了我的原始帖子。@skiwi-如果这对你有效,也许你应该将它标记为解决方案。如中所述,这样做有助于社区中的其他人,因为它标志着成功。您还应该对您的其他问题执行此操作,这些问题都得到了很好的回答。使用了您的解决方案,效果很好:)编辑了我的原始帖子。@skiwi-如果这对您有效,也许您应该将其标记为解决方案。如中所述,这样做有助于社区中的其他人,因为它标志着成功。你也应该这样做与你的其他问题,已经收到了很好的答案。