まず第一に、私の英語が完璧でなくてすみませんが、私は英語圏の国(スペイン)の出身ではないので...
さて、ここで質問です。クラスを作成するとき、物事を明確にするために、可能な限り一時変数を使用することをお勧めしますか、それとも変数をクラス変数として宣言することをお勧めしますか?
単純なクラス 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 は遅かれ早かれそれらを処理し、メモリを解放します。- ランタイムの残りの部分はそのままになるため、配列を final としてマークしました。- 正方形でないスプライト シートを使用する場合に備えて、SIZE 定数を幅と高さに分割します。- w と h を宣言するのは実際には良い考えです。パラメータでメソッドを呼び出すと、通常、実行速度が低下するためです(または、それは私がいくつかの場所で読んだことです)。- 0 は数回使用されるため、変数として宣言すると実行速度が向上すると思います (ほんの少しですが、とにかく目立たないでしょう)。
そして、それは基本的にすべてです。私は学生であり、おそらく私はいくつかの非常にn00bの間違いを犯していることに注意してください。経験豊富なプログラマーがたくさんいると確信しているので、ここで質問したかったのです.
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();
}
}
}
メソッドが本当に必要ないことに気づきました。コンストラクターですべてを実行できます。