[Processing][仕様].pdeはインナークラス、.javaは別クラス

 PDE(Processingの開発環境)を使っている人の中には、1つのスケッチ内で複数のタブを使っている人もいるかもしれません。複数のタブを使う理由としては、スケッチ本体クラスの他に別のクラスをつくるとき、ファイル(タブ)が分かれていた方が開発しやすいからだと思います。ちなみに、別のタブを開いた場合、ファイル内容は「タブ名.pde」という名前でスケッチのディレクトリに保存されます。

 もしかしたら勘違いをしている人がいるかもしれませんが、PDEの標準の仕様では、複数のタブを開いてクラスを書いても、1つのタブの中にクラスを書いても、コンパイル結果は同じになります。どういうことかというと、複数のタブを開いて別のクラスを作っても、そのクラスはスケッチ本体クラスのインナークラスとして結合されるのです。別の言い方をすると、スケッチのディレクトリ直下にある「*.pde」ファイルは、全部結合された後、コンパイルされるということです。

 Processing使い(ってなんて言うのかな?Processor?Processing Coder?)にとっては、基本的にはインナークラスになってくれる仕様のほうがありがたいと思います。別途クラスに分けていても、JavaとしてはPApplet派生クラス内のインナークラスなので、Processingの命令がそのまま使えます。インナークラス内で何事もなく描画命令が使えるのが一番の利点でしょう。

 ではインナークラスにされると困る場合はどうすればいいでしょうか?(そんなことあるのかよ!って突っ込みはナシでお願いしますw実際にさっき困ったのでこの記事を書いているわけなのでw)PDEとは違うエディタで開発する?そんな必要はありません。PDEのタブの特別な仕様として、[New Tab]でタブを作るとき、タブ名の後ろに「.java」をつけると、pdeファイルではなくjavaファイルを作ることができます。タブ名に「.(ドット)」を使うことはできないので、普通は「_(アンダー)」に置換されてしまうのですが、末尾の「.java」だけは例外で、javaファイルを作るときの印だそうです。

 [New Tab]からjavaファイルを作った場合、タブ名が「XXXX.java」という名前になっているので、一目でpdeファイルではないことがわかります。ファイル内容は、タブ名と同名でスケッチのディレクトリに保存されます。もし、途中からjavaファイルに変えたい場合は、Processing上で[Rename]するか、スケッチのディレクトリを開いて自分で拡張子を変えるかすれば、javaファイルにすることができます。もちろん、その逆でpdeファイルに戻すこともできます。

 下の英文は、ProcessingのPDEについての解説ページ内のタブについての説明文です。勝手に太字にしてしまいましたが、今回の「.java」ファイルの仕様についても触れられています。


Tabs, Multiple Files, and Classes

It can be inconvenient to write a long program within a single file.
When programs grow to hundreds or thousands of lines, breaking them
into modular units helps manage the different parts. Processing manages
files with the Sketchbook and each sketch can have multiple files that
are managed with tabs. The arrow button in the upper-right corner of
the Processing Development Environment is used to manage these files.
Click this button to reveal options to create a new tab, rename the
current tab, and delete the current tab. If a project has more than one
tab, they can also be hidden and revealed. Hiding a tab temporarily
removes that code from the sketch (it will not be compiled with the
program when you press Run).

Tabs are intended for more advanced users, and for this reason, the
menu that controls the tabs is intentionally made less prominent.

For programmers familiar with Java. When a program with
multiple tabs is run, the code is grouped together and the classes in
other tabs become inner classes. Because they’re inner classes, they
cannot have static variables. Simply place the “static” variable
outside the class itself to do the same thing (it need not be
explicitly named “static” once you list it in this manner). If you
don’t want code to be an inner class, you can also create a tab with a
.java suffix, which means it will be interpreted as straight java code.

It is also not possible to use static classes in separate tabs.
If you do this, however, you’ll need to pass the PApplet object to that
object in that tab in order to get PApplet functions like line(),
loadStrings() or saveFrame() to work.

Currently, the tabs get truncated when there are too many (Bug 54).

Environment (IDE) \ Processing 1.0 (BETA)

 一応、PDEのソースコードレベルでも調べてあります。Sketch.javaのbuild()メソッド内の、

[javacode]
// check to see if multiple files that include a .java file
externalRuntime = false;
for (int i = 0; i < codeCount; i++) {
if (code[i].flavor == JAVA) {
externalRuntime = true;
break;
}
}
[/javacode]

[javacode]
// 1. concatenate all .pde files to the ‘main’ pde
// store line number for starting point of each code bit

StringBuffer bigCode = new StringBuffer(code[0].program);
int bigCount = countLines(code[0].program);

for (int i = 1; i < codeCount; i++) {
if (code[i].flavor == PDE) {
code[i].preprocOffset = ++bigCount;
bigCode.append(‘\n’);
bigCode.append(code[i].program);
bigCount += countLines(code[i].program);
code[i].preprocName = null; // don’t compile me
}
}
[/javacode]

ら辺をみれば、外部ファイルとして扱ったり、pdeファイル同士を結合したりしているような雰囲気がわかると思います。

About: uechoco


One thought on “[Processing][仕様].pdeはインナークラス、.javaは別クラス”

Comments are closed.