【问题标题】:Java: design interface to force implementations to override toStringJava:设计接口以强制实现覆盖 toString
【发布时间】:2012-04-07 12:16:28
【问题描述】:

我正在开发一个 SPI,并希望定义一个 Reportable 接口,以便任何实现都必须将 toString() 覆盖为有意义的东西。

在 Java 中是否有任何方法可以编写一个接口,使其任何具体实现必须覆盖 Object 的 toString()?例如:

public interface Reportable
{
    public String toString();
}

public class Widget implements Fizz, Buzz, Reportable
{
    // ...

    @Override
    public String toString()
    {
        // ...
    }
}

我知道上面的代码不会强制这种行为,但这是我正在寻找的一个例子,即如果Widget 没有覆盖toString() 你得到编译错误,因为它违反了接口契约。

【问题讨论】:

标签: java inheritance overriding tostring


【解决方案1】:

不,你不能这样做。我建议你选择一个不同的方法名,例如

public interface Reportable
{
    String createReport();
}

这将强制实现编写适当的方法。 toString() 的意图已经有些模糊 - 无论是用于调试表示、用户可见表示(此时您需要询问自己有关区域设置等)。添加另一个含义对我来说似乎不是一个好主意。

【讨论】:

    【解决方案2】:

    我的理解是,您想要创建一组整齐地给出字符串表示的类。因此,当调用 System.out.println(yourobject) 之类的内容时,它会显示有意义的数据。

    您不能强制您的子类覆盖 toString。但是你可以这样做。

    abstract class MyBase
    {
        abstract String getNiceString();
        @Override
        public String toString()
        {
            return getNiceString();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2012-10-08
      • 2011-08-04
      • 2016-09-15
      • 1970-01-01
      • 2015-05-08
      相关资源
      最近更新 更多