覆盖类中的toString()方法可选

时间:2016-08-05 16:28:37

标签: java override optional

我有一个实例变量定义为:

final Optional<myClass> myOptional; 

我想覆盖其toString()方法,这样它就不会返回"[Optional(the value)]"而只返回"(the value)"(如果它是空的,则返回其他内容)。但我无法创建Optional的子类,因为它显然是最终的。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

GhostCat是正确的,因为您无法继承Optional并覆盖其toString方法。但是,你可以通过写下这个来获得你想要的效果:

String myString = myOptional.map(MyClass::toString).orElse("(empty)")

如果值存在,则会将myString设置为值toString方法的结果,否则如果值不存在,则将(empty)替换为字符串Optional。当然,你可以把你想要的任何替代字符串放在那里。

Optional是最终的,因此在将来的Java版本中将更容易转换为值类型。有关值类型的信息,请参阅Project Valhalla,特别是State of the Values的概述和背景信息。

- (void)myMethod { #if DEBUG [ClassMethod enableLogging]; #endif } 也是不可变的,因此必须防止子类化。请参阅Bloch, Effective Java ,第15项。

答案 1 :(得分:2)

你不能。

无法从外部源代码更改类方法的行为。所以,你唯一的选择是:

  1. 转到该类的源代码并在那里进行更改
  2. 扩展类,重写方法,然后使用派生类的对象
  3. 在您的情况下,两种选择都不可能。对不起,故事结束。

    (是的,其他解释性语言允许你这样做;但Java没有)。