2016-01-31 4 views
2

Я пытаюсь сделать что-то в лучшем «Groovy-way» возможным. ? Что лучший способ проверить тип аргумента (в отношении производительности и «Groovy-пути) У меня 2 внедрений в виду:Хороший/рекомендуемый подход для обеспечения правильного аргумента типа

def deploy(json) { 
    if (!(json instanceof String) && (json instanceof File)) { 
     json = json.text 
    } else { 
     throw new IllegalArgumentException('argument type mismatch – \'json\' should be String or File') 
    } 
    // TODO 
} 

или

def deploy(File json) { 
    deploy(json.text) 
} 

def deploy(String json) { 
    // TODO 
} 

Благодарности :)

+1

Второй. Если ваш метод должен принять тип, объявите его. Если он возвращает тип, объявите это также –

ответ

4

В вашем вопросе нет ничего особенного, это больше о сбоях в компиляции/выполнении.

В первом переменном сниппает json имеет Object типа и позволяет всему быть принято. Это произойдет сбой во время выполнения, если вы передаете в JSON объекте или Map по ошибке.

Во втором фрагменте json может быть либо File, либо String. Мне нравится больше.

+0

Я также предпочитаю второй вариант - ближе к Java, с которым мне больше нравится. В этом случае, вероятно, лучше пойти с Java, чем Groovy. Благодаря! – Matheus

1

в instanceof проверки должны быть хорошо, однако я думаю, что ваше состояние не так - кажется, что вы хотите сделать:.

if (json instanceof File) { 
    json = json.text 
} else if(!(json instanceof String)) { 
    throw new IllegalArgumentException('argument type mismatch – \'json\' should be String or File') 
} 

Вы также можете написать следующее:

if (json.class in [String.class, File.class]) { 

Вашего второй подход выглядит проще всего с двумя методами, которые ясно показывают намерение через свои подписи.

+0

Спасибо за ваш ответ :) Я думаю, что моя логика правильная, потому что я ожидаю String. Итак, если 'json' один, тип правильный. Кроме того, спасибо за '.class в [...]'. – Matheus

+0

@Matheus Условие вызовет 'IllegalArgumentException', если' json' были 'String'. – manouti

+0

Ничего себе. Ты прав. Еще раз спасибо. – Matheus