2017-01-26 11 views
-2

У меня есть этот код:Как использовать тернарный оператор с новым?

if (providers.length > 0) 
     this.providers = providers; 
    else 
     throw new IllegalArgumentException(); 

И я хочу, чтобы упростить его. Я пошел за:

(providers.length > 0) ? this.providers = providers : throw new IllegalArgumentException(); 

Но это дает мне ошибку компилятора. Зачем?

+3

Это не «упрощено», то есть несколько запутано и менее читаемо. – luk2302

+0

Синтаксис тернарного оператора: 'условие? value1: value2'. Оператор' throw' не является значением. Терминальный оператор не является универсальным сокращением для оператора 'if'. – khelwood

+0

Возможный дубликат [Может ли использовать тернарный/условный оператор Java (? :) для вызова методов вместо назначения значений?] (Http://stackoverflow.com/questions/12554547/can-javas-ternary-conditional-operator-be -used-to-call-methods-than-of) –

ответ

4

Причина, по которой тернарный оператор не работает, заключается в том, что это значение , задающее значения. Значение: «else» после «:» нужно вернуть значение того же типа, что и «then» case после «?».

throw new И не возвращает объект провайдеров ...

Но в конце концов, это не имеет значения, в любом случае; как действительно просто версия этого кода выглядит так:

if (providers.length == 0) { 
    throw new IllegalArgumentException(); 
} 

this.providers = providers; 

И для того, чтобы сделать вещи проще читать, вы можете даже пойти на:

checkProvidersNotEmpty(providers); 
this.providers = providers; 

Другими словами: вы двигаетесь исключение бросает в отдельный метод. неявное соглашение здесь будет заключаться в том, что метод с именем checkSomething() генерирует исключение, если проверка не выполняется. И помимо этого: дайте разумное сообщение при создании этого исключения. Это будет помочь отладки позже.

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

Использование тернарного оператора здесь не приведет к «легко читаемому» опыту. Таким образом: забудьте об этом.

0

Я не думаю, что вы действительно можете это сделать, потому что утверждение throw new IllegalArgumentException() не может быть присвоено providers.

От Java documentation about Equality, Relational, and Conditional Operators:

условных операторов

[...] Другой условный оператор ?:, который можно рассматривать как стенографии для if-then-else заявления (обсуждается в Управление Раздел «Сводные данные» данного урока). Этот оператор также известен как как тернарный оператор, потому что он использует три операнда. В приведенном ниже примере этот оператор следует читать как: «Если someCondition - true, присвойте значение value1result. В противном случае присвоить значение value2 к result «

-1

Вы можете сделать это тоже:.

this.providers = providers.length > 0 ? providers : null; 
if (this.providers == null) 
    throw new IllegalArgumentException(); 

Но обычно вы должны позволить ваш код в таких случаях, что, как это Вот в этом. дело значительно лучше и менее сложно.