忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

Java 列挙型

久々にJavaを使っていると(JOGL)、
列挙型の使い方がわからなくなったので
今後のためメモしておきます。

まず文脈を話しておくと、
Java用のOpenGL(JOGL)を使っていたのですが、
この定数が汚いんですね。

多くの定数がGLというクラスの中に定義されていて、
しかもその定数の種類というのが、
プリミティブのタイプもカリングモードも
行列の種類もアルファブレンディングも
なにもかもごっちゃになっています。

//プリミティブのタイプを表す定数
GL.GL_POINTS
GL.GL_LINES
GL.GL_LINE_STRIP
GL.GL_LINE_LOOP
GL.GL_TRIANGLES
GL.GL_TRIANGLE_FAN
...
//行列
GL.GL_PROJECTION
GL.GL_MODELVIEW

...(以下略)


ごちゃごちゃです。
まず第一、"GL"をなぜ2度も書かなければならないのか
そこが不条理です。

そして第二に、目的の異なる定数を1つのクラスに
大量に詰め込むのはよくありません。
どのくらい大量かというと、このくらいです。
もうわけがわかりません。

こんなときには列挙型を使って用途別に分別すべきです。
(そしてGLクラス全体のラッパーを作り始めたのですが、
ここではあまり関係ありません)

とりあえず最初は描画する図形のタイプを
表す定数を列挙型にすることにしました。

しくじってしまったのはここで、
C#のようなやり方をしてはいけません

Compile Error!

import javax.media.opengl.*;

public enum PrimitiveType {
	Points = GL.GL_POINTS,
	Lines = GL.GL_LINES,
	LineStrip = GL.GL_LINE_STRIP,
	LineLoop = GL.GL_LINE_LOOP,
	Triangles = GL.GL_TRIANGLES,
	TriangleFan = GL.GL_TRIANGLE_FAN,
	Quads = GL.GL_QUADS,
	QuadStrip = GL.GL_QUAD_STRIP,
	Polygon = GL.GL_POLYGON
}

正しくはこうです。
(javaのコードとして記法に問題がありますが、
まあほうっておきましょう(PointsではなくPOINTS))

import javax.media.opengl.*;

public enum PrimitiveType {
	Points(GL.GL_POINTS),
	Lines(GL.GL_LINES),
	LineStrip(GL.GL_LINE_STRIP),
	LineLoop(GL.GL_LINE_LOOP),
	Triangles(GL.GL_TRIANGLES),
	TriangleFan(GL.GL_TRIANGLE_FAN),
	Quads(GL.GL_QUADS),
	QuadStrip(GL.GL_QUAD_STRIP),
	Polygon(GL.GL_POLYGON);
	
	private int value;
	
	PrimitiveType(int value){
		this.value = value;
	}
	
	public int value(){
		return value;
	}
}

Javaでは = ではなく () を使うんですね・・・
知りませんでした。
そしてその値がコンストラクタの引数となるようです。
その値をわざわざ保存して、ゲッターで手に
入れられるようにしなければなりません。

そして、さらにC#と違う点として、値を複数指定することも出来ます。
例えば、サンの解説によると、太陽系の各惑星の列挙型を作ったとすれば、
質量と半径の両方を列挙型の値とすることができます。

このことから、Javaの列挙型はC#のものよりも柔軟であるといえるでしょう。
それがいいほうに向かうか悪い方に向かうかはわかりませんが。


拍手[0回]

PR