Java 自定义类能否知道调用它的对象的名称?

Java 自定义类能否知道调用它的对象的名称?,java,class,object,instance,Java,Class,Object,Instance,当通过对象(实例)调用方法时,该方法是否知道哪个实例(对象)调用了它 下面是我的意思的一个示例(伪代码): 伪代码示例 public class CustomClass{ public void myMethod(){ if (calling method is object1){ //Do something here } else { //Do something else } }/

当通过对象(实例)调用方法时,该方法是否知道哪个实例(对象)调用了它

下面是我的意思的一个示例(伪代码):

伪代码示例

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”语句的任何部分(或者如果肯定使用“int”值,则执行“switch”语句)但是这样做似乎真的很麻烦。

您可以在
CustomClass
中定义一个新属性,该属性将存储实例的标识符。如果只有少数
CustomClass
实例,则可以使用枚举类型

替换:

object1 = new CustomClass();
与:

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

private int id;
public CustomClass(int id) {
    this.id = id;
}
然后您可以替换:

if (calling method is object1){
与:

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

您可以在
CustomClass
中定义一个新属性,该属性将存储实例的标识符。如果只有少数
CustomClass
实例,则可以使用枚举类型

替换:

object1 = new CustomClass();
与:

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

private int id;
public CustomClass(int id) {
    this.id = id;
}
然后您可以替换:

if (calling method is object1){
与:

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

您需要的是

这样用吧

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

正如你的评论所说,你真正需要的也许是

你需要的是

这样用吧

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

正如你的评论所说,你真正需要的也许是


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

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

myObject1.foo();
myObject2.foo();
您是否希望
foo()
知道它是使用
myObject1
myObject1
调用的?但两个引用都引用同一个对象


知道这一点有非常复杂的方法。您可以使用一个流行的库(如javassist、ASM、CGLib)使用字节码工程,并将有关“对象名”的缺失信息注入字节码,然后读取这些信息。但我觉得这不是你需要的

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

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

myObject1.foo();
myObject2.foo();
您是否希望
foo()
知道它是使用
myObject1
myObject1
调用的?但两个引用都引用同一个对象


知道这一点有非常复杂的方法。您可以使用一个流行的库(如javassist、ASM、CGLib)使用字节码工程,并将有关“对象名”的缺失信息注入字节码,然后读取这些信息。但我觉得这不是你需要的

你为什么要这个?你想达到什么目的?变量“名称”真的没有意义。请注意,几个具有不同名称的变量都可以引用同一个对象。重要的是对象引用。我也同意@Heuster的观点,你提出这个请求的动机可能会影响最终的最佳答案。@Heuster,这是一个碰撞检测例程,其中我有一个平台,由3个瓷砖组成,一个左瓷砖、一个中瓷砖和一个右瓷砖,碰撞响应将根据角色点击的瓷砖而有所不同,因此,我需要碰撞检测例程来知道它正在处理哪种类型的平台平铺。我正在创建3个不同的对象(CDLeft、CDMiddle和CDRight,并从我的逻辑例程中调用它们,但它不知道如何区分。)然后,可能应该是游戏对象,即持有分幅并运行游戏的对象,它识别分幅发生碰撞的分幅,然后在两个分幅上调用碰撞方法,传递给这些方法的是哪种类型的磁贴与它发生了冲突。为什么要这样?你想达到什么目的?变量“名称”真的没有意义。请注意,几个具有不同名称的变量都可以引用同一个对象。重要的是对象引用。我也同意@Heuster的观点,你提出这个请求的动机可能会影响最终的最佳答案。@Heuster,这是一个碰撞检测例程,其中我有一个平台,由3个瓷砖组成,一个左瓷砖、一个中瓷砖和一个右瓷砖,碰撞响应将根据角色点击的瓷砖而有所不同,因此,我需要碰撞检测例程来知道它正在处理哪种类型的平台平铺。我正在创建3个不同的对象(CDLeft、CDMiddle和CDRight,并从我的逻辑例程中调用它们,但它不知道如何区分。)然后,可能应该是游戏对象,即持有分幅并运行游戏的对象,它识别分幅发生碰撞的分幅,然后在两个分幅上调用碰撞方法,向这些方法传递什么类型的平铺与它发生了冲突。感谢@Mohayemin,这是一个有趣的方法,我能看到的唯一问题是,我的自定义类中的方法非常大,我认为用这种方式,我必须有3个基本相同的独立方法,只有几行不同的代码。如果我在这一点上有错误,请纠正我?@Zippy:任何常见的代码都可以是超类实现的一部分,如果需要,子类可以在方法重写中调用这些代码。如果是这样,您需要另一种设计