在这种情况下扩展List <e>是否有用?</e>

时间:2014-01-28 19:11:35

标签: java list oop generics java-8

考虑我有以下代码:

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 个答案:

答案 0 :(得分:2)

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

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

  • 显然,你正在操纵很多List<Drawable>。但是,当您想要实现ArrayListStackLinkedList或其他任何内容时,为了获得更好的效果,您将很乐意保留当前的实施。
  • 如果您延长List<Drawable>,请记住,如果没有大量重构,您将永远不会在程序中更改此内容。当你需要延长其他课程的那一天(出于更好的理由),你什么都不做。

尽管如此,您可以创建一个对象DrawableList,它将操作列表:

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

在本课程中,您可以通过定义自己的方法来调用List方法。