Pergunta sobre java, inheritance, override, tostring – Java: interface de design para forçar implementações a substituir toString

11

Estou desenvolvendo um SPI e gostaria de definir umReportable interface tal que qualquer implementação deve substituirtoString() para algo que é significativo.

Existe alguma maneira em Java para escrever uma interface de tal forma que qualquer uma das suas implementações concretasdevo substituir ObjetotoString()? Por exemplo:

<code>public interface Reportable
{
    public String toString();
}

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

    @Override
    public String toString()
    {
        // ...
    }
}
</code>

Eu sei que o código acima nãoforça esse tipo de comportamento, mas é um exemplo do que estou procurando, ou seja, seWidget não substituitoString() você recebe um erro de compilação porque está violando o contrato da interface.

Sua resposta

2   a resposta
17

Não, você não pode fazer isso. Eu sugiro que você escolha umdiferente nome do método, por ex.

<code>public interface Reportable
{
    String createReport();
}
</code>

Isso forçará as implementações a escrever um método apropriado.toString() já é um pouco vago em sua intenção - se é para representações de depuração, representações visíveis ao usuário (em que ponto você precisa se perguntar sobre locais, etc). Adicionandooutro significado não parece ser uma boa ideia para mim.

10

O que eu entendo é que você quer criar um conjunto de classes que claramente forneça suas representações de string. Então, quando algo comoSystem.out.println(yourobject) é chamado mostra dados significativos.

Você não pode forçar suas subclasses a sobrescrever toString. Mas você pode fazer algo assim.

<code>abstract class MyBase
{
    abstract String getNiceString();
    @Override
    public String toString()
    {
        return getNiceString();
    }
}
</code>
engenhoso, obrigado pela ideia. :) Daren
brilhante! esta deve ser a resposta aceita. SnakeDoc

Perguntas relacionadas