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;

    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。

一定有一种简单的方法可以做到这一点,而且我不想每次想绘制 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);

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

最佳答案

扩展 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。那么矩形类就不必是抽象的;相反,它会将实现委托(delegate)给辅助对象(可以在构造时或通过 setter 提供)。

关于Java匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15815332/

相关文章:

java - boolean 条件总是评估 true

java - 我可以在 JPA 中查询对象吗

java - Autowired 为空且不适用于 Jersey + Spring

java - 如何统计每个单词出现的次数?

java - 在Java中拆分文件以进行多线程

java - 如何将有符号整数转换为无符号长工作

Java 条件语句

java - 如何将整数 ArrayList 转换为 double[]?

java - 将 REST API 的 404 响应更改为 200 空响应

java - 如何保持多线程 Java/Scala 应用程序运行?