Enum間で同じ動作を実装する:この静的メソッドは、インターフェイスからインスタンスメソッドを非表示にすることはできません

ポール:

ユーザーに応じて、進行状況の値とステップ番号が異なる共通のプロセスがあります。

これを解決するために、私はインターフェースを作りました:

public interface Progress {
    int getTotalStepNumber();
    int getIndex();
    String getMessage();
    @Override
    String toString();
}

したがって、ステッププロセスの実装は次のようになります(文字通り、これはこのプロセスのステップの列挙です)。

public enum ProgressImplementationOfProcessOne implements Progress {

    STEP_ONE(1, "Step one message."),
    STEP_TWO(2, "Step two message.");
    // ... etc. with more steps

    /**
     * Number of steps for this process.
     */
    private static final int STEPS = 2;

    private int index;
    private String message;

    ProgressImplementationOfProcessOne(int index, String message) {
        this.index = index;
        this.message = message;
    }

    @Override
    public int getTotalStepNumber() { return STEPS; }

    @Override
    public int getIndex() { return this.index; }

    @Override
    public String getMessage() { return this.message; }

    @Override
    public String toString() { return this.message; }
}

しかしvalueOf()、列挙の方法を使用して、実装から対応するステップを見つけるのもよいと思いましただから私は私のインターフェイスに次の行を追加しました:

default Progress valueOf(String s) {
    for (Progress progress : this.getValues()) {
        if (progress.getMessage().equals(s)) {
            return progress
        }
    }
    return null;
}
default Progress valueOf(int i) {
    for (Progress progress : this.getValues()) {
        if (progress.getIndex() == this.getIndex()) {
            return progress;
        }
    }
    return null;
}

getValues()インターフェースProgressメソッドがないため、次のメソッドを追加しました(「enum実装はそれをネイティブに処理する」と考えています)。

default List<Progress> getValues() { return null; }

しかし、私はそれぞれについてこのエラーが発生する理由がわかりませんProgressImplementationThis static method cannot hide the instance method from Progress.

class ProgressStepenum値を置き換え、クラスによってenumを属性などに置き換える追加作成することでそれを行うことができることはわかっていますが、enumは複数の値を処理できるので、もっと簡単にできると思いました。

XtremeBaumer:

ですでに指定されvalueOfているようにvalueOfEnum単にのような名前に変更するだけです。valueOfjava.lang.Enum

public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                            String name) {
    T result = enumType.enumConstantDirectory().get(name);
    if (result != null)
        return result;
    if (name == null)
        throw new NullPointerException("Name is null");
    throw new IllegalArgumentException(
        "No enum constant " + enumType.getCanonicalName() + "." + name);
}

このメソッドのコメントには、次のセクションが含まれています。

特定の列挙型Tの場合、名前から対応する列挙定数にマップするために、このメソッドの代わりに、その列挙で暗黙的に宣言されたpublic static T valueOf(String)メソッドを使用できます。列挙型のすべての定数は、その型の暗黙のpublic static T [] values()メソッドを呼び出すことで取得できます

強調鉱山

ご覧のとおり、valueOf(String s)はすべての列挙型クラスですでに宣言されていますが、これが理由であり、列挙型のインターフェイスでは使用できません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ