プライベート関数のテスト2008年06月30日 14時17分26秒

先日、テスト用のプログラムを書いていて驚いてしまった。private 関数は、当該クラス内のインスタンス関数からしか呼べないものだと思っていたので。どうも、public void main(String[] args) を始めとする、static 関数からも呼べてしまうようだ。

簡単な例をあげよう。


public class Test {
	
	private void Private()
	{
		System.out.println("private");
	}
	
	public void Public()
	{
		System.out.println("public");
	}
	
	public static void main(String[] args)
	{
		Test t = new Test();

		t.Private();
		t.Public();
	}
}

以下の環境で試した。


% java -version
java version "1.6.0_03-p4"
Java(TM) SE Runtime Environment (build 1.6.0_03-p4-root_20_feb_2008_11_31-b00)
Java HotSpot(TM) Client VM (build 1.6.0_03-p4-root_20_feb_2008_11_31-b00, mixed mode)


% javac Test.java
% java Test
private
public

インスタンスを必要としない static 関数が、自身内でインスタンスを生成すれば、private 関数を呼べてしまう。どうも違和感が残るが悪いとは思わない。しかし、main 関数はプログラムを起動し実行するためのもので、Java では必ずクラスを作らなければいけないので、static だとの認識だったので、この事実を発見した時は、目を疑ってしまった。

しかし、各クラスに main を作り、各クラスの簡単なテストコードを書くことがよくある。そのテストの為に、private 関数を作りたいところを、public 関数にしたこともあったので、テスト用には、この動作はむしろ好都合だ。仕様と、変数での動作が気になるので後で調べようと思う。

次回