在用Java创建对象的方法之后编辑它们

时间:2013-08-25 14:35:16

标签: java oop

在JavaScript中,可以动态创建和编辑对象的功能。这可能是Java对象的方法吗?我基本上想要这样的东西:

public class MyObject{
  private int x;
  public MyObject(){x = 0;}
  public myMethod(){}
}

MyObject foo = new MyObject();

后来打电话给:

foo.myMethod = new method({x = 42;});

5 个答案:

答案 0 :(得分:2)

这不是直接可能的,但你可以尝试这样的事情:

public class MyObject {
    private int x;

    interface MyMethod {
        void call();
    }

    public MyObject() {
        x = 0;
    }

    public MyMethod myMethod = new MyMethod() {
        @Override
        public void call() {
            x = 42;
        }
    };
}

答案 1 :(得分:1)

您无法以上面尝试演示的方式对其进行编辑,您可以做的最接近的方法是拦截该方法。我目前唯一能想到的方法是使用MethodInterceptor库中的cglib拦截方法。

答案 2 :(得分:1)

在Java中你不能像在Javascript中那样做。

但在Java中,您可以使用策略模式实现此类行为。 例如,

public interface Strategy {
 void doSomething(MyObject obj);
}

public class BasicStrategy implements Strategy {
 public void doSomething(MyObject obj) {
  //do something
 }
}

public class AnotherStrategy implements Strategy {
 public void doSomething(MyObject obj) {
  obj.setX(42);
 }
}

public class MyObject {
  private Strategy actualStrategy = new BasicStrategy();
  private int x = 0;

  public void executeStrategy() {
   actualStrategy.doSomething(this);
  }

  public void setStrategy(Strategy newStrategy) {
    actualStrategy = newStrategy;      
  }

  public void setX(int x) {
   this.x = x;
  }
}

您可以使用以下代码在运行时更改方法的行为。

MyObject obj = new MyObject();
obj.setStrategy(new AnotherStrategy());
obj.executeStrategy();

答案 3 :(得分:0)

是的,这在理论上是可行的,但你不想这样做。这种事情是黑魔法,如果你需要问这个问题,那么你已经准备好了几年了。

那就是说,你想要完成的事情可能适用于the Strategy design pattern。这里的想法是你定义一个interface,它有你需要换出的方法(例如,calculate()),并且你要改变它的行为的类有一个该接口的字段。然后,您可以修改该字段的内容。

public interface Calculator {
    double calculate(double x, double y);
}

public class MathStuff {
    private Calculator calc;
    ...
    public void doStuff() {
         ...
         result = calc.calculate(x, y);
         ...
    }
}

public class Add implements Calculator {
    public double calculate(double x, double y) {
        return x + y;
    }
}

答案 4 :(得分:0)

你不能这样做。在java new方法中,返回类Object的实例,而不是方法。有一点是要理解Javascript是一种函数式编程语言,而Java是一种面向对象的语言。您不能将方法视为java中的对象,也会破坏java封装的安全性。