Java: интерфейс разработки для принудительной реализации переопределения toString

Я разрабатываю 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(), вы получаете ошибку компиляции, потому что она нарушает интерфейса.

Ответ 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();
    }
}