两个变量a,b。 b的值是a计算出来的。我要是将这两个变量都申明为类的成员变量,那么一个对象的实例初始化后,改变其中的a值,那么b的值却还是保持原来的值。这种情况,大家是怎么解决的?下面的程序中,a的值改为3后,b还是为2。public class Test{
private int a;
private int b; public Test(){
this.a=1;
this.b=a*2;
} public void setA(int a){
this.a=a;
} public void echoA(){
System.out.println("a="+this.a);
}

public void echoB(){
System.out.println("b="+this.b);
} public static void main(String[] args){
Test ts=new Test();
ts.echoA();
ts.echoB();
ts.setA(3);
ts.echoB();
}
}

解决方案 »

  1.   

    public void setA(int a){
    this.a=a;
                      this.b=this.a*2;
    }
      

  2.   

    谢谢楼上的,但是那个地方没问题啊,改过来还是原来的结果,b仍然没被更新。我知道没被更新是因为这个值只传到了a,而没有从a传到b,但是我想知道的是,大家怎样处理,或者说如何避免出现这种现象的?
      

  3.   

    或者把计算b独立出来成为一个内部函数,每当a更新时都调用此函数,如:
    public class Test{
    private int a;
    private int b;
              
    public Test(){
    this.a=1;
    makeB();
    }
             private void makeB(){
                  this.b=a*2;
             } 
    public void setA(int a){
    this.a=a;
                      makeB();
    } public void echoA(){
    System.out.println("a="+this.a);
    }

    public void echoB(){
    System.out.println("b="+this.b);
    } public static void main(String[] args){
    Test ts=new Test();
    ts.echoA();
    ts.echoB();
    ts.setA(3);
    ts.echoB();
    }
    }
      

  4.   

    恩是的,killme2008的方法我也想到了,但是定义setA()方法时,里面还要加上makeB()方法,感觉很别扭,因为setA()就时set a的值,却还要记得再在方法里更新b的值,感觉方法不纯净,实际上,我想问大家的就是,有没有一种设计方法,能保持方法的纯净简洁。
      

  5.   

    你还没理解类在程序设计中的作用
    这样写才是最合理的:
    public class Test{
    private int a;
    private int b; public Test(){
    setA(1);
    } public void setA(int a){
    this.a=a;
    this.b=this.a*2;
    } public void echoA(){
    System.out.println("a="+this.a);
    }

    public void echoB(){
    System.out.println("b="+this.b);
    } public static void main(String[] args){
    Test ts=new Test();
    ts.echoA();
    ts.echoB();
    ts.setA(3);
    ts.echoB();
    }
    }
      

  6.   

    楼上的写法也并未达到LZ所说的"纯净"要求,LZ是希望setA方法中只有this.a=a是吧?这就是AOP发挥作用的地方,spring可以非常漂亮的解决这个问题,写个拦截器,拦截setA方法,在此方法调用之后调用makeB方法更新b.
      

  7.   

    恩,kill2008说的就是我的意思,AOP怎么写呢?能不能麻烦举个例子?
      

  8.   

    你看看我过去写的一个介绍spring增强的短文,对AOP应该可以有个大概的了解,想深入请下电子书或者spring reference,有详细介绍http://blog.csdn.net/killme2008/archive/2006/04/22/673012.aspx
      

  9.   

    这一题的逻辑我着实的没弄懂.
    既然你希望改变a  但是b不变.那就是说,无论a怎么改变,b都不会变是吧..
    那你设置成常量算了..
      

  10.   

    建议看一下敏捷软件开发,里面的LSP原则有类似的例子
      

  11.   

    public class Test{
    private int a;

             private int b(int a){
                int temp=a*2;   
                return temp;
             }; public Test(){
    this.a=1;
    } public void setA(int a){
    this.a=a;
    } public void echoA(){
    System.out.println("a="+this.a);
    }

    public void echoB(){
    System.out.println("b="+this.b(a));
    } public static void main(String[] args){
    Test ts=new Test();
    ts.echoA();
    ts.echoB();
    ts.setA(3);
    ts.echoB();
    }
    }