好久没来了,心生雅兴,出一小题为难下大家假设A.getB中123 为随机数
不能修改B.getC 方法 ,不能修改A.getB 方法
怎么修改A中的getC 标记处,让整个程序执行时打印这个随机数
需考虑线程安全public class A {
private static A a=null;
private A(){

}
public synchronized static A getInstance(){
if (a==null) {
a=new A();
}
return a;
}

public B getB(){
B b=new B();
b.s="123";
return b;
}
public C getC(){
C c=new C();
//此处可修改
return c;
}
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
A a=A.getInstance();
B b=a.getB();
C c=b.getC();
System.out.println(c.s);
}
}
public class B {
String s="ttt";

public C getC() {
A a=A.getInstance();
C c=a.getC();
return c;
}
}
public class C {
String s="1234";
}

解决方案 »

  1.   


    public class A {
    private static A a=null;
    private A(){

    }
    public synchronized static A getInstance(){
    if (a==null) {
    a=new A();
    }
    return a;
    }

    public B getB(){
    B b=new B();
    Random random = new Random(); 
    b.s=random.nextInt()+"";
    return b;
    }
    public C getC(){
    C c=new C();
    //此处如何获取调用的 b.s
    return c;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    A a=A.getInstance();
    B b=a.getB();
    C c=b.getC();
    System.out.println(b.s.equals(c.s));
    }
    }使打印始终为true
      

  2.   

    System.out.println(A.getInstance().getB().s);
    这样行不?我都不知道你可以改的范畴。
      

  3.   

    每调用一次A。getB 那么对象B的s就不是原来的那个了
      

  4.   

    每次getB(),都会Random一个值出来。所以只能调用一次getB(),而且只能获取返回的同一个实例B才能相等。而要获得那个同一实例,就等于要在main获得getB之后再进行操作,而且需把那个实例带入。即,只能在B.getC()里面做。
      

  5.   

    放宽点儿要求吧
    可以修改A 及A.getB方法 但要严格考虑线程安全
      

  6.   

    这题有意思吗?要和b.s一样的话 那肯定是取出当前线程中的那个B的s变量的值 算法没有 编码也不是正常人的思路 debug的话就可以看到s的值 知道debug怎么保存的当前线程的值就可以取到 Thread类貌似应该有办法获取  太高深啦 路过
      

  7.   

    其实可以转变一种思路
    以一种简单的方式实现
    在A.getB中将对象A保存起来
    然后再A。getC中获取
    然后反射即可
    当然,这之中也有一个算法,需要考虑线程安全
    嘿嘿
      

  8.   

    你这是什么思路 我保存A干什么?????
    public synchronized static A getInstance(){
            if (a==null) {
                a=new A();
            }
            return a;
        }
     这里本来就是线程安全的 取出的a就是一直用的那个A 
    在A.getB中将对象A保存起来 
    这个就不说保存的多余了 你保存A 在反射和b.s有关系吗? 反射就是invoke这个方法  我都有a对象了 我还反射做什么?反射做什么?????
    如果你想说把B保存到a的某个field中 你不懂getb方法你怎么保存 
      

  9.   

    b.getC()其实应该等于a.getC();
    就是说要在a.getC()中获得getB()中的哪个值;估计要从memory去抓了,应该涉及到很低层的调用巴。
      

  10.   

    b.getC()不等于a.getC(),b.getC()可以对b.s进行操作,但a.getC()无法对实例b进行操作,只能操作到一个B的新实例。
      

  11.   

    lz不是说了不能修改B.getC 方法 
      

  12.   

    说不能修改b.getC的方法,只是为了保留用户的操作习惯
    现在放宽要求,要求在保留原来的用户操作流程操作行为习惯的前提下可以对各方法进行修改
    不能传递b的对象实例
      

  13.   

    对此程序做一个外科手术
    使用代理,在代理中管理类的实例
    或者直接在jvm中取出类实例
    ……