簡體   English   中英

使用基本枚舉作為從屬枚舉的默認值

[英]Using a base enum as a default for dependent enums

我正在使用標准化Web服務的客戶端,但其中一個供應商的行為略有不同,因此我們必須考慮這些行為。 要做到這一點,我們一直在使用枚舉:

public enum ServiceProviderType {
    FOO, BAR;

    public ServiceProviderType checkService(String url) {
        if (url.equals("http://www.example.com")) {
            return ServiceProviderType.FOO;
        } else {
            return ServiceProviderType.BAR;
        }
    }
}

這些行為的差異也根據我們對服務的要求而有所不同,例如我們可能會請求一個圖層並希望該圖層為紅色,但要知道BAR和FOO服務以不同方式表示RGB值。 為此,我們創建了另一個枚舉,用於存儲服務中每個層所需的屬性。

public enum LayerServiceProviderType {
    FOO("#ff0000"),
    BAR("#ff5555");

    private String colour;

    public ServiceProviderType(String colour) {
        this.colour = colour;
    }

    public String getColour() {
        return colour;
    }

    public ServiceProviderType checkService(String url) {
        if (url.equals("http://www.example.com")) {
            return ServiceProviderType.FOO
        } else {
            return ServiceProviderType.BAR;
        }
    }
}

這種方法很好,除非我們想要處理多個層並將它們視為同一個基本枚舉的衍生物。 基本上我們希望將Layer1ServiceProviderType.BAR作為等價於Layer2ServiceProviderType.BAR。 但是我們不能對枚舉進行子類化,甚至試圖這樣做也似乎打破了各種聲音設計原則。

我的第一個想法是有一個包含枚舉的接口:

interface ServiceProvider {
    ServiceProviderType {FOO, BAR};

    ServiceProviderType getServiceProviderType();

    ServiceProvider checkService(String url);
}

public enum LayerServiceProvider implements ServiceProvider {
    FOO (ServiceProviderType.FOO, "#ff0000"),
    BAR (ServiceProviderType.BAR, "#ff0000");

    public LayerServiceProvider(ServiceProviderType serviceProviderType, String colour) {
        this.serviceProviderType = serviceProviderType;
        this.colour = colour;
    }

    @Override
    public ServiceProviderType getServiceProviderType() {
        return this.serviceProviderType;
    }

    @Override
    public ServiceProvider checkService(String url) {
        if (url.equals("http://www.example.com")) {
            return LayerServiceProviderType.FOO
        } else {
            return LayerServiceProviderType.BAR;
        }
    }
}

但是,對於我來說,在枚舉中使用枚舉,每個都具有相同的值。 有一個更好的方法嗎?

也許訪客模式是你正在尋找的。

與枚舉一起使用時,它基本上允許在不使用switch語句的情況下添加依賴於枚舉的邏輯。

例:

public enum ServiceProviderType {
    FOO {
        @Override public <T> T apply(Action<T> action) { return action.doFoo(); }
    },
    BAR {
        @Override public <T> T apply(Action<T> action) { return action.doBar(); }
    };

    public interface Action<T> {
        T doFoo();
        T doBar();
    }

    public abstract <T> T apply(Action<T> action);

    public static ServiceProviderType checkService(String url) {
        if (url.equals("http://www.example.com"))
            return FOO;
        return BAR;
    }
}

public class LayerServiceProviderType implements ServiceProviderType.Action<String> {
    @Override
    public String doFoo() {
        return "#ff0000";
    }
    @Override
    public String doBar() {
        return "#ff0000";
    }
}

public class Main {
    public static void main(String[] args) {
        ServiceProviderType type = ServiceProviderType.checkService("");

        String colour = type.apply(new LayerServiceProviderType());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM