6

列挙型を作成しましたが、無制限の数のパラメーターを取得して文字列を返す String.format 操作を列挙型でサポートできるようにしようとしています。オブジェクトを返すことができただけで、このメソッドを使用した後、toString()/casting を実行する必要があります。私はそれを行うためのより「クリーンな」方法、またはおそらくメソッドをより適切にオーバーライドするtoString()方法があると推測しています。基本的にはこのメソッドをサポートしたかったのtoString()ですが、残念ながらそれができなかったので、このメソッドを作成しました。ご覧のとおりtext(..)、 ではなく名前が付いていtoString()ます。

どうすればこれを改善できますか?私が望んでいた理想的な解決策toString(..)は、文字列を返すようなものでした。

public enum MY_ENUM {

    VALUE_A("aaa %s"), VALUE_B("bbb %s");

    private String text;

    MY_ENUM(String text) {
        this.text = text;
    }

    public String text() {
        return this.text;
    }

    public Object text(final Object... o) {
        return new Object() {
            @Override
            public String toString() {
                return String.format(text(), o);
            }
        };
    }
}
4

2 に答える 2

9

私はあなたがどこに向かっているのか分かります...これがあなたが望むものだと思います(テスト済みで、動作します):

public String toString(Object... o) {
    return String.format(text, o);
}

設計上の観点から、本当に必要でない限り、テキストを公開しませんtext(つまり、getterを使用します)。フォーマット文字列として使用されるという事実は、実装上の選択です。私は単にこれを行います:

public static enum MY_ENUM {

    VALUE_A("aaa %s bbb %s"),
    VALUE_B("bbb %s");

    private final String text;

    MY_ENUM(String text) {
        this.text = text;
    }

    public String toString(Object... o) {
        return String.format(text, o);
    }
}

余談ですが、私はクラスのアイデアが本当に好きです。前にそれを見たことがありません。

于 2012-04-18T18:48:33.883 に答える
4

toString()さらにパラメーターを渡す必要がある場合は、オーバーライドできません (toString()何も受け取りません)。列挙型で新しいメソッドを定義するだけで、オーバーライドする必要はありません。

public String getAsFormattedText(Object... o) {
    return String.format(text, o);
}

このメソッドtoString()に名前を付けないでください。現在のオブジェクトの文字列表現を返すのではなく、パラメーターとして渡されたオブジェクトの書式設定された文字列を返すため、混乱を招く可能性があります。また、text()メソッドは呼び出される必要がありgetText()ます。これは Java の規則です。

返された文字列が文字列ではないことを明確に示す名前を使用することをお勧めします。これは、テキストがパラメーターとしてフォーマットされることを期待するフォーマットされた文字列ですgetAsFormattedText()。これを明確に表現します。

于 2012-04-18T18:48:36.367 に答える