0

无论如何,当通过对象(实例)调用方法时,该方法知道哪个实例(对象)调用了它?

这是我的意思的示例(伪代码):

伪代码示例

public class CustomClass{


public void myMethod(){


    if (calling method is object1){

    //Do something here

    }

        else {

        //Do something else

        }


        }//End of method


}//End of class

然后在另一个班级:

public SomeOtherClass{

CustomClass = object1;

public void someOtherMethod(){

object1 = new CustomClass();

object1.myMethod();    //This will call the 1st condition as the calling object is object1, if it were some other object name, it would call the 2nd condition.

    }//End of method

}//End of class

可能的解决方法

我发现这样做的唯一方法是让该方法接受另一个参数,比如一个“int”,然后检查该 int 的值并执行与它相关的“if else”语句的任何部分(或“ switch' 语句,如果肯定使用 'int' 值),但这似乎是一种非常混乱的方式。

4

3 回答 3

4

你需要的是策略模式

public abstract class CustomClass {
    public abstract void MyMethod();
}

public class Impl1 extends CustomClass {
    @Override
    public void MyMethod() {
        // Do something
    }
}

public class Impl2 extends CustomClass {
    @Override
    public void MyMethod() {
        // Do something else
    }
}

以这种方式使用它

public static void main(String[] args) {
    CustomClass myObject = new Impl1();
    // or CustomClass myObject = new Impl2();
}


正如您的评论所说,您真正需要的可能是模板方法模式

public abstract class CustomClass {
    public void myMethod(){ // this is the template method
        // The common things
        theDifferentThings();
    }

    public abstract void theDifferentThings();
}

public class Impl1 extends CustomClass {
    @Override
    public void theDifferentThings() {
        // Do something
    }
}

public class Impl2 extends CustomClass {

    @Override
    public void theDifferentThings() {
        // Do something else
    }
}
于 2013-05-19T18:32:28.787 回答
0

您可以定义一个新属性,CustomClass其中将存储实例的标识符。如果只有几个实例,CustomClass那么您可以使用枚举类型。

代替:

object1 = new CustomClass();

和:

object1 = new CustomClass(1);

向 CustomClass 添加一个新的构造函数和一个属性:

private int id;
public CustomClass(int id) {
    this.id = id;
}

然后你可以替换:

if (calling method is object1){

和:

if (id == 1){

但是,请记住,这是一个糟糕的设计。根据调用此方法的实例,您不应该有不同的逻辑条件。您应该为此目的使用多态性。

于 2013-05-19T18:27:51.640 回答
0

你可以通过调用知道当前班级getClass().getName()的名字。但是您无法知道对象的名称,而且这没有任何意义:

MyClass myObject1 = new MyClass();
MyClass myObject2 = myObject1;

myObject1.foo();
myObject2.foo();

您是否foo()想知道它是使用myObject1or调用的myObject1?但是两个引用都指向同一个对象!

好的,有非常复杂的方法可以知道这一点。您可以使用 javassist、ASM、CGLib 等流行库之一使用字节码工程,并将有关“对象名称”的缺失信息注入字节码,然后读取此信息。但是恕我直言,这不是您所需要的。

于 2013-05-19T18:33:18.943 回答