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();
}
}