【问题标题】:Method signature in function overriding with final qualifier in parameter在参数中使用 final 限定符覆盖函数中的方法签名
【发布时间】:2014-05-17 07:38:37
【问题描述】:
class T {}

interface Interface{
    void method(final T t);
}

class FirstClass implements Interface{

    public void method(T t){
         //valid
    }

    public void method2(final T t){

    }
}

class SecondClass extends FirstClass {
    public void method2(T t){
        //valid
    }
}

在上面的代码中,为什么在重写方法时没有考虑 final 限定符?

我对方法签名中最终限定符的理解是,方法不允许更改引用。但是我不明白它有什么用?

假设我正在使用 3rd 方 jar,我担心 3rd 方 jar 在处理时不应更改我的对象,代码应该是这样的,

3rdPartyClass.doProcess((final) myObject);

class 3rPartyClss {
  public void doProcess(SomeClass myObject){}
}

但为什么会这样

3rdPartyClass.doProcess(myObject);

class 3rPartyClss {
  public void doProcess(final SomeClass myObject){}
}

如果第 3 方知道他不会更改方法内的对象引用,那么在签名中包含 final 有什么用?在覆盖方法中,它也不会考虑最终限定符。那么它的真正用途是什么呢?

我发现了类似here 的问题,但希望对此进行更多说明

【问题讨论】:

    标签: java oop overriding final


    【解决方案1】:

    在上面的代码中,为什么在重写方法时没有考虑 final 限定符?

    因为它是一个实现细节。它与调用者完全无关。这意味着在方法中,代码不能为该参数分配新值。即使可以,调用者也不会看到那个新值。 (这也意味着它也可以在方法中的匿名方法中使用,但这是一种副作用。)

    方法中唯一对重载和覆盖很重要的方面是对调用者重要的方面——参数类型、可访问性和方法名称。 (返回类型对覆盖很重要,但对重载很重要;方法是否为静态方法会以不同的方式影响不同的事物。)参数是否为 final 与方法是否同步无关紧要。

    任何带有这样最终参数的方法:

    public void foo(final String x) {
        ...
    }
    

    可以简单地改写为:

    public void foo(String x) {
        final String y = x;
        // Code using y instead of x
    }
    

    【讨论】:

    • o_O 太快了……这一切都是在我阅读链接问题的时间内完成的
    • @assylias:是的,这很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多