Как ограничить допустимые параметры и значения при построении запроса GET? - PullRequest
1 голос
/ 30 декабря 2011

Я пытаюсь создать библиотеку, которая обращается к онлайн-API RESTful. API определил список реализованных методов, допустимые параметры для каждого метода и (в некоторых случаях) допустимые значения для заданных параметров. Я думал, что хотел бы убедиться, что (A) могут быть вызваны только реализованные методы; (B) только разрешенные параметры могут быть определены для данного метода; и (C) если для данного параметра разрешены только определенные значения, допускаются только эти значения.

(A) относительно просто, просто используя перечисление "Метод":

public enum Method {
    getObjectById,
    getObjectBySearch, 
    ...
}

для (B) я думал, что каждый экземпляр Method должен иметь свое собственное перечисление разрешенных параметров, а для (C) некоторые параметры, перечисление разрешенных значений, вроде как (извините, если это кого-то делает передергивает):

ПРИМЕЧАНИЕ: СЛЕДУЮЩИЙ КОД НЕ ДЕЙСТВУЕТ JAVA; ЭТО ТОЛЬКО ЗДЕСЬ КАК КОНЦЕПТУАЛЬНЫЙ ПРИМЕР.

public enum Method {
    getObjectById () {
        enum Parameter {
            objectId;
    },
    getObjectBySearch () {
        enum Parameter {
            query,
            queryType () {
                enum Type { type1, type2 }
            }
        }
    }
}

Очевидно, что локальные перечисления не разрешены в Java, поэтому это невозможно сделать; и я думаю, что есть более изящные способы достижения моей конечной цели, но я не практикуюсь более 5 лет, поэтому я изо всех сил пытаюсь найти их.

Или, может быть, я обдумываю это и пытаюсь добиться такого типа безопасности типов в параметрах и значениях моего запроса - это действительно плохая практика (опять же, я не очень опытен) - если это так, я был бы признателен объяснение того, почему это плохая практика.

Спасибо,
- Игорь

1 Ответ

1 голос
/ 30 декабря 2011

Почему бы вам просто не обернуть каждый вызов метода внутри объекта службы, который проверяет его аргументы?

public class Service {
    public SomeObject getObjectById(String objectId) {
        if (isNotValidObjectId(objectId) {
            throw new IllegalArgumentException("objectId is invalid");
        }
        // TODO call the appropriate method
    }

    public SomeObject getObjectBySearch(String query, QueryType queryType) {
        if (isNotValidQuery(query) {
            throw new IllegalArgumentException("query is invalid");
        }
        if (queryType == null) {
            throw new IllegalArgumentException("queryType is mandatory");
        }
        // TODO call the appropriate method
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...