元の質問に答えるには
簡単に言えば、外部からメソッド変数にアクセスすることはできません。あなたがしたいことは、それらの変数フィールドをクラス内に作成することです。それらをメソッドの外側に置くということは、メソッドが完了した後も残り続けることを意味し、外部からそれらにアクセスできることを意味します。
public class EnterLeaveHandler implements IOtfHandler {
private long time;
private int func;
private int cpuid;
private int source;
// Please don't use varargs like this; read the whole answer!!
public void handle(Object ... args) {
time = (Long) args[0];
func = (Integer) args[1];
cpuid = (Integer) args[2];
source = (Integer) args[3];
}
}
次に、 getterとsetterを作成してアクセスします。
public long getTime() {
return time;
}
public void setTime(long t) {
time = t;
}
// etc...
ただし、いくつかの提案...
あなたのコードは...控えめに言っても奇妙です。また、非常にJavaに似ていません。可能な限り、異なるデータを必要とする複数のオーバーライド メソッドを持たないようにする必要があります。また、通常、他のメソッドではなく、コンストラクターでフィールドを初期化する必要があります。
どの程度のコードにアクセスできるかは明確ではありませんが、インターフェースを書き直すことができるなら、私は間違いなくそうします。Object
インターフェイスの varargs は奇妙です。インターフェイスを使用する理由は、同一のパラメーターでインターフェイス メソッドを呼び出すことができ、その下のオブジェクト タイプに関係なく、何か有用なことが起こるようにするためです。同じメソッドの 2 つの実装がまったく異なる引数を必要とすることは、インターフェイスのポイントを無効にします。次のコードは、この理由を示しています。
IOtfHandler h1 = new EnterLeaveHandler();
IOtfHandler h2 = new DefFunctionHandler();
h1.handle(0, 0, 0, 0);
h2.handle(0, 0, 0, 0); // Crashes with ClassCastException!! :(
// And would also crash two lines later with ArrayIndexOutOfBoundsException
それらを完全に異なるメソッドにする方がはるかに優れています。期待している変数がわかっているので、その事実を利用する必要があります。メソッドのシグネチャは、次のように見える方がはるかに優れています。
public class EnterLeaveHandler implements IOtfHandler {
public void handle(long time, int func, int cpuid, int source) {
// Do things with your shiny new variables
}
public class DefFunctionHandler implements IOtfHandler {
public void handle(int stream, int func, String name, int funcgroup, int source) {
// Do things with your shiny new variables
}
}
他の人が示唆しているように、「実際の」メソッド署名が同一でない場合は、インターフェイスを使用しないでください。代わりに抽象基本クラスを使用して、それらの間で共通する小さなデータを保持することをお勧めします。
abstract class IOtfHandler {
private int source;
private int func;
public void setSource(int source) {
this.source = source;
}
// etc
}
class EnterLeaverHandler extends IOtfHandler {
private long time;
// etc
}
class DefFunctionHandler extends IOtfHandler {
private String name;
// etc
}
もちろん、コンストラクターですべての変数を設定すると、基本クラスに抽象メソッドを追加できる場合があります。handle()
これは、そのメソッドが同じ署名を持ち、引数をまったくとらないためです!
最終結果
したがって、私が話したすべての変更をまとめると、メソッド変数をフィールドに移動し、ゲッターとセッターを使用し、便利なメソッド シグネチャを使用し、コンストラクターを使用し、誤解を招くインターフェイスの代わりに基底クラスを使用すると、最終的には次のようになります。このようなもの:
abstract class IOtfHandler {
private int source;
private int func;
public void setSource(int source) {
this.source = source;
}
public int getSource() {
return source;
}
public void setFunc(int func) {
this.func = func;
}
public int getFunc() {
return func;
}
// abstract handle method
abstract public void handle();
}
class EnterLeaverHandler extends IOtfHandler {
private long time;
private int cpuid;
// getters and setters
public void setTime(long time) {
this.time = time;
}
public long getTime() {
return time;
}
public void setCpuId(int cpuid) {
this.cpuid = cpuid;
}
public int getCpuId() {
return cpuid;
}
// constructor
public EnterLeaverHandler(long time, int cpuid, int source, int func) {
setTime(time);
setCpuId(cpuid);
setSource(source);
setFunc(func);
}
// handle method
public void handle() {
System.out.println("EnterLeaverHandler.handle()");
// Do whatever class-specific handling you might want to do in here.
}
}
class DefFunctionHandler extends IOtfHandler {
private String name;
private int funcGroup;
private int stream;
// getters and setters
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setFuncGroup(int funcGroup) {
this.funcGroup = funcGroup;
}
public int getFuncGroup() {
return funcGroup;
}
public void setStream(int stream) {
this.stream = stream;
}
public int getStream() {
return stream;
}
// constructor
public DefFunctionHandler(String name, int funcGroup, int stream, int source, int func) {
setName(name);
setFuncGroup(funcGroup);
setStream(stream);
setSource(source);
setFunc(func);
}
// handle method
public void handle() {
System.out.println("DefFunctionHandler.handle()");
// Do whatever class-specific handling you might want to do in here.
}
}
public class Main {
public static void main(String[] args) {
IOtfHandler h1 = new DefFunctionHandler("name", 0, 0, 0, 0);
IOtfHandler h2 = new EnterLeaverHandler(0, 0, 0, 0);
h1.handle();
h2.handle();
}
}