- PR -

メソッドは、変数としてメソッド間で受け渡しできないのでしょうか?

投稿者投稿内容
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2006-10-13 12:21
アプリケーションを作成しながら思ったのですが、メソッドはメソッド間で受け渡しできないのでしょうか。
特定のインスタンスを生成し、そのインスタンスが保持している変数とその変数を使った特定のメソッドを受け渡す事ができれば、便利なのかなぁと思いました。

コンパイルエラーが出ていますが、イメージはこのような感じです。

import java.lang.reflect.Method;

public class Exe {
public static void main(String[] args) {
Exe exe = new Exe();
exe.execute(test.test());//コンパイルエラーになります。
}
private void execute(Method met){
//metを実行したい。
}
public void test(){
System.out.println("success!!");
}
}

実現すればプログラムの幅が膨らみそうなのですが、、、
どなたかご教授頂けませんでしょうか。
よろしくお願い致します。
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-10-13 12:27
リフレクションとか使えば似たような機能は実現できそうですが。。。

http://www.hellohiro.com/reflection.htm
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-10-13 12:36
そういう仕組みは「クロージャ」と呼ばれるもので、Java7での導入が検討されています。
現状ではリフレクションを使うか、インスタンスごと受け渡すしかないですね。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-10-13 12:37
.NET なら delegate を使えば可能ですが、Java では素直にインターフェースを使うのが吉なんじゃないでしょうか。
_________________
囚人のジレンマな日々
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-10-13 12:55
引用:

囚人さんの書き込み (2006-10-13 12:37) より:
Java では素直にインターフェースを使うのが吉なんじゃないでしょうか。



インターフェース・・・?
Javaだとインターフェースでメソッドが受け渡せるのでしょうか?
りる
会議室デビュー日: 2005/09/16
投稿数: 4
投稿日時: 2006-10-13 12:55
初めて書き込みます。
興味があったので実装してみました。
Methodのinvokeは実行するobjectを必要とするので、
引数にobjectとメソッド名を取ってみました。

無理矢理感漂うコードですが、参考になれば。

--
import java.lang.reflect.Method;
public class ExecMethod {
public static void main(String[] argc) {
ExecMethod test = new ExecMethod();
test.Execute(test, "test");
String a = "a";
String b = (String) test.Execute(a, "toString");
System.out.println(b);
}
public Object Execute(Object obj, String methodName) {
Object result = null;
Class exe = obj.getClass();
try {
Method exec = exe.getMethod(methodName, null);
result = exec.invoke(obj, null);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public void test() {
System.out.println("test");
}
}
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-10-13 13:02
interfaceで処理するのが普通ですね。

通常は何かしらの規定された動きを期待するメソッドを
呼び出すことになるでしょうから、引数や戻り値が定義できる
interfaceを用いることになります。
シグネチャの定まらないメソッドを自在に呼ぶ共通機能って
ちょっと想定できないですからね。
デバッガ類を作るならわからなくもないけど。

リフレクションでも可能ですが、シグネチャが固定される場合は
interfaceを使ったほうがまず間違いなくよい設計になるでしょうし、
面倒がないし分かりやすいコードになるでしょうね。
staticなメソッドはともかく、インスタンスメソッドを呼び出すには
対象となるインスタンスも渡さないといけないわけで、
interfaceを用いて実装クラスのオブジェクト渡すのと大差ない。
メソッドからthrowされる例外の扱いとかも間接的に行う必要があるわけで、
あえてリフレクションを使うメリットがない。

自分はクロージャをサポートしている言語は使ったことがないのですが、
どうにもクロージャの説明を読んでも利便性がよく分からないんですよね。
やっぱり実際に使ってみないとピンとこないのでしょうか。

# オブジェクト指向とかDIコンテナとか使うまで利便性がよくわからなかったし。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-10-13 13:03
引用:

インターフェース・・・?
Javaだとインターフェースでメソッドが受け渡せるのでしょうか?


もちろん無理です。
コード:
interface Test{
	public abstract test();
}

public class Exe implements Test{ 
	public static void main(String[] args) { 
		Exe exe = new Exe(); 
		exe.execute(exe);
	} 
	private void execute(Test met){ 
		//metを実行したい。 
		met.test();
	} 
	public void test(){ 
		System.out.println("success!!"); 
	} 
} 


至って普通ですが、こんな感じです。
#Java 長い事触ってないから、あってるかな…。

_________________
囚人のジレンマな日々

スキルアップ/キャリアアップ(JOB@IT)