有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在这种情况下扩展List<E>有用吗?

认为我有以下代码:

public interface Drawable {
    public void compileProgram();

    public Program getProgram();

    public int getDataSize();

    public FloatBuffer putData(final FloatBuffer dataBuffer);

    public int getDataMode();

    public void draw(final int offset);

    public void delete();

    public static int countDataSize(final Collection<Drawable> drawables) {
        return drawables.stream()
                .mapToInt(Drawable::getDataSize)
                .sum();
    }

    public static FloatBuffer putAllData(final List<Drawable> drawables) {
        FloatBuffer dataBuffer = BufferUtils.createFloatBuffer(countDataSize(drawables) * 3);
        for (Drawable drawable : drawables) {
            drawable.putData(dataBuffer);
        }
        return (FloatBuffer)dataBuffer.clear();
    }

    public static void drawAll(final List<Drawable> drawables) {
        int offset = 0;
        for (Drawable drawable : drawables) {
            drawable.draw(offset);
            offset += drawable.getDataSize();
        }
    }

    public static void deleteAll(final List<Drawable> drawables) {
        drawables.stream().forEach(Drawable::delete);
    }
}

public class Terrain implements Drawable { ... }

public class Floor implements Drawable { ... }

我的用法如下:

private final Terrain terrain;
private final Floor floor;
private final List<Drawable> drawables;

public FPSGameController(final int screenWidth, final int screenHeight, final boolean debug) {
    super(screenWidth, screenHeight, debug);

    this.terrain = new Terrain();
    this.floor = new Floor();
    this.drawables = new ArrayList<>();

    drawables.add(terrain);
    drawables.add(floor);
}

...

@Override
protected void render(final double msDelta) {
    super.render(msDelta);

    glClearColor(25f / 255f, 25f / 255f, 112f / 225f, 1.0f);
    glClearDepthf(1f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    Drawable.drawAll(drawables);
}

那么,创建一个类是否是正确的方法:

public class DrawableList extends List<Drawable> { ... }

实现Drawable接口中当前静态的功能

另外:我的实现目前是否执行了一些通常违反编码标准的实践


共 (1) 个答案

  1. # 1 楼答案

    在界面Drawable中使用静态方法似乎不错。据我所知,可以将静态方法写入接口(使用Java 8)以避免Collections之类的静态类

    回答你关于DrawableList的问题,这可能是个坏主意。有两个原因:

    • 显然,你在操纵很多List<Drawable>。但是当你想要实现一个ArrayList、一个Stack、一个LinkedList或者其他任何东西来获得更好的性能时,你会很乐意保持当前的实现
    • 如果你扩展了List<Drawable>,请记住,如果不进行大量重构,你永远不会在程序中改变这一点。当你需要延长另一门课的时候(出于更好的原因),你什么也做不了

    不过,您可以创建一个对象DrawableList,它将操作一个列表:

    public class DrawableList {
        private List<Drawable> list;
    }
    

    在这个类中,您可以通过定义自己的方法来调用List方法