Java匿名类
我对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;
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-如果这对您有效,也许您应该将其标记为解决方案。如中所述,这样做有助于社区中的其他人,因为它标志着成功。你也应该这样做与你的其他问题,已经收到了很好的答案。