2012-02-18 59 views
5

有人问我电话采访时以下问题我有:如何拦截超类的构造函数参数?

考虑下面的类定义:

public class ClassA { 
    public ClassA(int x) { 
     // do some calculationand initialize the state 
    } 
} 

和初始化使用随机整数生成一个超类的子类。

public class ClassB extends ClassA { 
    public ClassB() { 
     super(StaticUtilityClass.someRandomIntegerValGenerator()) 
    } 
} 

你需要拦截x的值(随机INT由someRandomIntegerValGenerator生产)并将其存储在ClassB的构件。 ClassA不能更改。 我最终不知道如何做到这一点,因为ClassB构造函数中的第一个调用需要调用super()。直到super()被调用,ClassB没有状态,并且someRandomIntegerValGenerator生成的值不能被分配给任何ClassB成员。我唯一的方向是使用 ThreadLocal 但我认为这应该是一些更简单的解决方案。

有什么想法?

回答

10

如何:

public class ClassB extends ClassA { 
    public ClassB() { 
     this(StaticUtilityClass.someRandomIntegerValGenerator()); 
    } 

    private ClassB(int x) { 
     super(x); 
     // Can access x here, e.g.: 
     this.x = x; 
    } 


    private int x; 
} 
+0

的X是失去了这一点 – aviad 2012-02-18 22:07:33

+0

@aviad:迷失在什么时候? – 2012-02-18 22:07:52

+0

不应该而是“这个”是“超级”吗?只是为了达到任务条件? – Gangnus 2012-02-18 22:09:40