我认为从程序实现角度讲,这样做没有问题。
但在具体的程序设计时,要考虑对象的内部状态问题。一个最简单的重构,就是这样设计A
public class A {
    private int a = 0;    public void setValue(int a) { 
        this.a = a; 
        
        //do other jobs
    }
    public int getValue() { return a; }
}如果要改变A实例的状态,需要调用setValue()方法,在setValue()方法你可以与其它类同步状态。这样代码就比较容易控制。

解决方案 »

  1.   

    用Cloneable 这个interface 就可以解决这个问题
    class A implements Cloneable {
      public int a = 0;
      public Object clone() {
        try {
          return super.clone();
        }
        catch (CloneNotSupportedException e) {
          throw new InternalError(e.toString());
        }
      }
    }
    class B {
      private A m_a;
      public A getM_a() {
        return (A) m_a.clone();
      }
      public void setM_a(A m_a) {
        this.m_a = (A) m_a.clone();
      }
    }
    public class AB {
      public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.a = 0;
        b.setM_a(a);
        A tmp_a = b.getM_a();
        System.out.println(tmp_a.a);
        a.a = 10;
        System.out.println(tmp_a.a);
      }
    }
      

  2.   

    自己构造clone算法,或用BeanUitl等第三方包的clone方法
      

  3.   

    我觉得clone是另一种实现方法。
    当要改变对象的内部状态的时候,这种情况下的处理,在effective java programming一书提到过,像a.a的设计不是不可以,但没有经过良好的封装。应该是private的对象域同非private的访问接口来共同实现。
      

  4.   

    即使对a.a做了get和set程序,如果不用clone方式,还是无法解决这个问题呀
      

  5.   

    再请教chesterwoo一个问题,是不是如果我的类的成员变量都支持clone方法,那么我这个类就应该完全支持clone了吧。
      

  6.   

    你必须implements Clonenable这个interface, 否则不行推荐你读一下这篇文章
    http://java.sun.com/developer/JDCTechTips/2001/tt0306.html
      

  7.   

    谈不到请教,我的水平并不高,大家一起讨论吧。我觉得是不是clone,要视设计需要而定。
    对于clone的实现,网友们都已实现。另外,对象的克隆有深度克隆和浅度克隆之分。
      

  8.   


     class A 
    {
        public int a = 0;    
    } class B 
    {
        private A m_a;    public A getM_a() 
        {
            return m_a;
        }    public void setM_a(A m_a) 
        {
            this.m_a = m_a;
        }}public class C 
    {
        public static void main(String[] args) 
        {
            A a = new A();
            B b = new B();
            a.a = 0;
            b.setM_a(a);
            A tmp_a = b.getM_a();
            System.out.println(tmp_a.a);
            a.a = 10;
            System.out.println(tmp_a.a);    }
    }结果是:
    0
    10
    Press any key to continue...还有一种方法:  class B 
    {
        private A m_a;    public A getM_a() 
        {
            return m_a;
        }    public void setM_a(A m_a) 
        {
            this.m_a = m_a;
        }
        public  A geta()
        {
         return new A();
        }
        class A 
    {
        public int a = 0;    
        
    }}public class C 
    {
        public static void main(String[] args) 
        {
            
            B b = new B();
            B.A a = b.geta();
            a.a = 0;
            b.setM_a(a);
            B.A tmp_a = b.getM_a();
            System.out.println(tmp_a.a);
            a.a = 10;
            System.out.println(tmp_a.a);    }
    }结果是相同的。
    这样你认为解决了吗?
    A是B的内隐类,不可以直接使用A类,得通过B才可以。我理解的对吗?
    小猪笨!~_~ 见笑了!