自定义类是否可以知道调用它的对象的名称?

时间:2013-05-19 18:24:43

标签: java class object instance

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

这是我的意思的一个例子(伪代码):

伪代码示例

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'值),但这似乎是一种非常混乱的方式。

3 个答案:

答案 0 :(得分:4)

您需要的是Strategy Pattern

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();
}

<小时/> 正如您的评论所说,您真正需要的可能是Template method Pattern

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
    }
}

答案 1 :(得分: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){

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

答案 2 :(得分:0)

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

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

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

您是否foo()知道是否使用myObject1myObject1来调用它?但两个引用都引用了同一个对象!

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