在修改对象的方法调用之后获取原始对象状态

时间:2018-09-19 21:10:12

标签: java

我开始研究Java中的OOP概念,试图创建用于点,线,平面和曲面的基本类,但是我在创建的方法上遇到了麻烦。

public class Punto{
  public double x, y;

  public Punto(double pX, double pY){
      this.x = pX;
      this.y = pY;
  }

  public String puntoTela(){
      return "( " + x + " , " + y + " )";
  }

  public void rotacion(double grado) {
      double rad = (grado * Math.PI) / 180;

      this.x = (this.x * Math.cos(rad) + this.y * - Math.sin(rad));
      this.y = (this.x * Math.sin(rad) + this.y * Math.cos(rad));       
  }


 }

我的问题是:如果我声明Punto p = new Punto(5, 2)并调用rotation方法,我将无法返回到原始值。

public class Ejemplo {
   public static void main(String[] args){
      Punto p = new Punto(5, 2);
       System.out.println(p.puntoTela()); // shows (5, 2)

        p.rotacion(45);
        System.out.println(p.puntoTela()); // shows (5, 2) after rotatin 90 deg = (2.1, 2.9)

        System.out.println(p.x); // 2.1 i want original value of 5


    }

}

我试图为旋转方法创建局部变量,但是它不起作用我该怎么办?格拉西亚斯!

2 个答案:

答案 0 :(得分:5)

您可以将Punto类设为immutable。然后,rotation方法(和其他“ mutator”方法)将返回一个新的(修改的)对象,而不是更改原始的对象:

public Punto rotacion(double grado) {
      double rad = (grado * Math.PI) / 180;

      double newX = (this.x * Math.cos(rad) + this.y * - Math.sin(rad));
      double newY = (this.x * Math.sin(rad) + this.y * Math.cos(rad));       

      return new Punto(newX, newY);
  }

您可以在许多JDK类中观察到这种模式,例如BigDecimalLocalDateString等。

那么用法是:

public static void main(String[] args) {
    Punto p = new Punto(5, 2);
    System.out.println(p.puntoTela()); // shows (5, 2)

    // Note that the new value is assigned to a new variable, 
    // so that we still have access to the old value
    Punto rotated = p.rotacion(45);
    System.out.println(rotated.puntoTela()); // rotated

    System.out.println(p.x); // original
}

答案 1 :(得分:1)

您基本上有两个选择:

  • 创建方法void rotate(double grado)来更改对象本身
  • 创建方法Punto rotated(double grado),该方法将返回一个新的Point,该值等于旋转了一定量的原始点

您不能做的是让一个对象同时旋转而不是同时旋转。