Прежде всего, извините меня, если мой английский не идеален, но я не из англоязычной страны (Испания), так что...
Ну вот вопрос. При создании класса рекомендуется использовать все возможные временные переменные, или лучше объявить ваши переменные как переменные класса, просто для того, чтобы все было ясно?
Я приведу вам пример, используя простой класс SpriteSheet. Это очень короткий и популярный класс, используемый почти в каждой 2D-игре на Java.
Вот код, который изначально был запланирован создателем учебника, который я смотрел:
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, меня больше интересует качество моих оптимизаций.
¿Улучшил ли я что-то или ухудшил (сделал вещи на самом деле медленнее, менее читабельными, труднее поддерживать в будущем, сделал то, что компилятор все равно будет делать...)?
Извините, если мой вопрос слишком длинный и слишком расплывчатый, это мой первый вопрос, так что полегче со мной;)
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Я только что прочитал это после небольшого перерыва, и это не имеет никакого смысла (вы видели, что я анализирую параметры ширины и высоты для загрузки () и никогда их не использую?)
Вот как я считаю должно быть:
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();
}
}
}
Только что понял, что мне не нужен этот метод. Все можно сделать в конструкторе.