【问题标题】:What is the reason for compile warning "static method declared final"? [duplicate]编译警告“静态方法声明为final”的原因是什么? [复制]
【发布时间】:2019-03-08 19:25:09
【问题描述】:

我有一个常量类,我试图在运行时使用公共静态最终字符串设置批号常量。我的 IDE 给我一个警告“静态方法声明为 final”,我想知道我是否做错了什么。

file 从 Spring yml 文件中获取值。

私有字符串文件; (xxx-12345.txt)

public String getBatchNo() {
    return parseBatchNo(file);
}

public static final String parseBatchNo(String file) {
    return file.substring((file.lastIndexOf("-") + 1), (file.length() - 4));
}

【问题讨论】:

  • 移除final关键字
  • 所以如果我多次调用 getBatchNo ,它不会重新运行 parseBatchNo 逻辑?
  • 您是否打算只在第一次调用parseBatchNo 方法时运行它的逻辑?然后你需要在某处缓存(“memoize”)结果。
  • @George - "所以如果我多次调用 getBatchNo,它不会重新运行 parseBatchNo 逻辑吗?" 不,像所有方法一样,每次你调用它都会运行调用它。
  • 因此,如果要在每次调用时重新运行该方法,那么如果我只是从类中每次调用它,那么使用 static final 的目的是什么。为什么不将其切换为私有并只返回一个字符串?此外,这可能有点离题,但有人可以提供缓存示例吗?

标签: java


【解决方案1】:

静态方法不会被覆盖。

final 关键字隐藏了方法。有关详细信息,请参阅 cmets 中的链接。

请注意,您不应该依赖这种行为,尽管语言允许这样做。您应该始终以 <class-name>.<method-name> 的形式调用静态方法。

【讨论】:

  • @T.J.Crowder 好点,我没有意识到这一点。但是调用静态方法时不应该总是使用类名吗?
  • 啊,我们正在讨论风格问题。 :-)(是的,我愿意。)
  • @alexrolea 你不应该总是并不意味着该语言不允许允许这样做 - 因此,有人可能会滥用它;我会将这个答案改写为 finalstatic do 有意义,请阅读我在该答案下的最后评论
  • @alexrolea 调用方法时应该做什么并不重要。关键是,final 修饰符 确实 会影响您是否可以在子类中声明具有相同签名的方法。
【解决方案2】:

静态方法不能被扩展类覆盖,因此final关键字在这种情况下是无用的。

【讨论】:

  • 有趣的是,实际上相同的答案获得了 4 次赞成票,而这一次获得了 0 票:D
  • 那是因为另一个人是第一个。如果已经存在相同的答案,则不回答是礼仪。
  • @DodgyCodeException 如果您看起来不错,它实际上是在同一分钟内(几秒钟的差距)。当我按下Enter 时,两个答案都出现了。
【解决方案3】:

当应用于方法时,final 关键字与应用于字段时的含义不同:它并不意味着“常量”。

你可以使用一些逻辑来实现你想要的:

private static String batchNo;

public static String parseBatchNo(String file) {
    if (batchNo == null) {
        batchNo = file.substring((file.lastIndexOf("-") + 1), (file.length() - 4));
    }
    return batchNo;
}

(注意上面的方法不是线程安全的。如果你需要从多个线程调用它会稍微复杂一些。)

【讨论】:

  • 您需要从类属性中删除 final ,因为无法从方法中设置该值,我相信正如他们在其他答案中所说的那样,方法中的 final 在这种情况下是无用的。
  • @George 你是对的。我已经纠正了我的错误(由于不小心复制和粘贴)
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多