考虑我有以下代码:
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
界面中当前为静态的功能?
另外:我的实施目前是否执行了一些通常违反编码标准的做法?
答案 0 :(得分:2)
界面Drawable
中静态方法的使用似乎很好。据我所知,可以将静态方法写入接口(使用Java 8),以避免像Collections
等静态类。
要回答关于DrawableList
的问题,这可能是一个坏主意。有两个原因:
List<Drawable>
。但是,当您想要实现ArrayList
,Stack
,LinkedList
或其他任何内容时,为了获得更好的效果,您将很乐意保留当前的实施。 List<Drawable>
,请记住,如果没有大量重构,您将永远不会在程序中更改此内容。当你需要延长其他课程的那一天(出于更好的理由),你什么都不做。尽管如此,您可以创建一个对象DrawableList
,它将操作列表:
public class DrawableList {
private List<Drawable> list;
}
在本课程中,您可以通过定义自己的方法来调用List
方法。