【问题标题】:How to intercept super class constructor argument?如何拦截超类构造函数参数?
【发布时间】:2012-02-18 22:02:25
【问题描述】:

我在电话面试中被问到以下问题:

给定以下类定义:

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

及其使用随机整数生成器初始化超类的子类。

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

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

有什么想法吗?

【问题讨论】:

    标签: java constructor


    【解决方案1】:

    这个怎么样:

    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;
    }
    

    【讨论】:

    • 不应该用“super”代替“this”吗?只是为了满足任务条件?
    • x 没有丢失,this 构造函数链接到同一类中的另一个构造函数,允许您使用 x,因为它存储在参数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多