无论如何,当通过一个对象(实例)调用一个方法来知道哪个实例(对象)调用它时?
这是我的意思的一个例子(伪代码):
伪代码示例
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'值),但这似乎是一种非常混乱的方式。
答案 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()
知道是否使用myObject1
或myObject1
来调用它?但两个引用都引用了同一个对象!
好的,有非常复杂的方法来了解这一点。您可以使用流行库(如javassist,ASM,CGLib)之一使用字节代码工程,并将有关“对象名称”的缺失信息注入字节代码,然后读取此信息。但恕我直言,这不是你需要的。