gpt4 book ai didi

Java优化: declaring class variables VS using temporary variables

转载 作者:行者123 更新时间:2023-12-01 23:06:01 25 4
gpt4 key购买 nike

首先,如果我的英语不太好,请原谅,但我不是来自英语国家(西类牙),所以...

嗯,问题来了。创建类时,“尽可能使用临时变量是一个好习惯,还是最好将变量声明为类变量,只是为了保持清晰?

我会给你一个例子,使用一个简单的类 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 常量拆分为宽度和高度,以防万一我决定使用一些非方形 Sprite 表。- 声明 w 和 h 实际上是一个好主意,因为在参数中调用方法通常不利于执行速度(或者这就是我在某些地方读到的内容)。- 由于 0 被多次使用,我相信将其声明为变量将有助于提高执行速度(只是一点点,反正可能不会被注意到)。

这基本上就是全部了。请注意,我是一名学生,可能会犯一些非常严重的错误,这就是我想在这里问的原因,因为我确信周围有很多经验丰富的程序员。

请记住,我并不真正关心 SpriteSheet 类,我更好奇我的优化质量。

¿我是否改进了某些东西或使它们变得更糟(使事情实际上变得更慢,可读性更差,将来更难维护,做编译器无论如何都会做的事情......)?

抱歉,如果我的问题太长且太模糊,这是我的第一个问题,所以请放心;)

提前致谢。

编辑:

我只是休息了一下才读到它,它没有任何意义(你有没有看到我正在解析 width 和 height 参数来加载()并且从不使用它们?)

这是我认为应该是的:

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();
}
}

}

刚刚意识到我真的不需要这个方法。一切都可以在构造函数中完成。

最佳答案

Or is better to declare your variables as class variables, just in order to keep things clear?

我认为你的意思是“属性”(实例变量),而不是静态(类)变量。将所有内容声明为实例变量将使事情变得非常非常不清楚。

简短回答:对于在不同方法之间共享的数据,仅在绝对必要时才使用局部变量并创建属性。此外,访问局部变量可能比访问属性稍快一些。

关于Java优化: declaring class variables VS using temporary variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22739281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com