【发布时间】:2014-05-09 11:25:41
【问题描述】:
首先,如果我的英语不完美,请原谅我不是来自说英语的国家(西班牙),所以...
好吧,问题来了。创建类时,尽可能使用临时变量是一种好习惯,还是最好将变量声明为类变量,以保持清晰?
我会给你一个例子,使用一个简单的 SpriteSheet 类。是一个非常简短且流行的类,几乎用于 Java 中的所有 2D 游戏。
这是我正在观看的教程的创建者最初计划的代码:
public class SpriteSheet {
private String path;
private final int SIZE;
public int[] spriteSheetPixels;
public SpriteSheet(String path, int size) {
this.path = path;
SIZE = size;
spriteSheetPixels = new int[SIZE * SIZE];
load();
}
private final void load() {
try {
BufferedImage image = ImageIO.read(SpriteSheet.class
.getResource(path));
int w = image.getWidth();
int h = image.getHeight();
image.getRGB(0, 0, w, h, spriteSheetPixels, 0, w);
} catch (IOException e) {
e.printStackTrace();
}
}
}
关键是,据我所知,他只是在做一个普通的课程,遵循所有 Java 约定。看了之后觉得可以稍微改进一下。这是我的同一类的版本:
public final class SpriteSheet {
public final int[] spriteSheetPixels;
public SpriteSheet(final String path, final int width, final int height) {
spriteSheetPixels = new int[width * height];
load(path, width, height);
}
private final void load(final String path, final int width, final int height) {
try {
BufferedImage image = ImageIO.read(SpriteSheet.class
.getResource(path));
final int w = image.getWidth();
final int h = image.getHeight();
final byte ZERO = 0;
image.getRGB(ZERO, ZERO, w, h, spriteSheetPixels, ZERO, w);
} catch (IOException e) {
e.printStackTrace();
}
}
}
以防万一,如果您不想过多关注,我将尝试恢复我已更改的内容以及原因: - 在类声明中添加了“final”,因为我认为我不需要实例化它。 - 删除了除数组之外的所有类变量,因为它是我最终会从这个类中使用的唯一东西。我觉得将其余变量声明为类变量只是浪费内存。如果它们是临时的,如果我没记错的话,它们会被使用,然后 GC 迟早会处理它们,释放内存。 - 将数组标记为最终数组,因为它将在运行时的其余部分保持不变。 - 将 SIZE 常量拆分为宽度和高度,以防我决定使用一些非方形精灵表。 - 声明 w 和 h 实际上是一个好主意,因为在参数中调用方法通常不利于执行速度(或者这是我在某些地方读到的)。 - 由于0被多次使用,我相信将其声明为变量将有助于提高执行速度(只是一点点,反正可能不会被注意到)。
这基本上就是全部了。请注意,我是一名学生,可能会犯一些非常严重的错误,这就是我想在这里问的原因,因为我相信周围有很多经验丰富的程序员。
请记住,我并不真正关心 SpriteSheet 类,我对我的优化质量更好奇。
¿我是改进了事情还是让事情变得更糟(实际上让事情变得更慢、可读性降低、将来更难维护、做编译器无论如何都会做的事情......)?
对不起,如果我的问题太长太模糊,我的第一个问题是这样吗,对我来说很容易;)
提前致谢。
编辑:
我只是在稍作休息后阅读它,它没有任何意义(您是否看到我正在将宽度和高度参数解析为 load() 而从不使用它们?)
我认为应该是这样的:
public final class SpriteSheet {
public final int[] spriteSheetPixels;
public SpriteSheet(final String path, final int width, final int height) {
final byte ZERO = 0;
spriteSheetPixels = new int[width * height];
try {
BufferedImage image = ImageIO.read(SpriteSheet.class
.getResource(path));
image.getRGB(ZERO, ZERO, width, height, spriteSheetPixels, ZERO,
width);
} catch (IOException e) {
e.printStackTrace();
}
}
}
刚刚意识到我真的不需要这个方法。一切都可以在构造函数中完成。
【问题讨论】:
-
类变量定义对象的属性。如果您认为某个变量对该对象的属性没有贡献,那么最好将其保留为临时变量。这一切都取决于你想如何设计你的课程。
-
是的,有时,最难的是知道你是否真的需要这些属性(例如,将它们用于从另一个类访问的东西)。
标签: java optimization class-variables code-readability temporary-objects