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:任何常见的代码都可以是超类实现的一部分,如果需要,子类可以在方法重写中调用这些代码。如果是这样,您需要另一种设计