Мое предложение состоит не в том, чтобы сделать ваш код короче, а сделать его более расширяемым и простым в обслуживании. Это, однако, сделает код клиента намного короче.
Я бы выбрал enum
, но без оператора switch, так как я могу определить стратегию здесь, и я бы предпочел инкапсулировать логику вне клиента. Кроме того, я бы предоставил абстракцию (интерфейс), которая позволила бы мне или другим в будущем предлагать альтернативные реализации, не добавляя новые константы в enum
. Литеральные значения для ваших строк и чисел я бы определил как константы (в абстракции, если это имеет смысл)
Вот абстракция "стратегии":
interface PageCounter {
String FIRST = "first";
String ALWAYS_FIRST = "alwaysFirst";
int FIRST_SIZE = 5;
int DEFAULT_SIZE = 10;
int getAccountListSize(String whatPageNext, List<?> acctIdList);
}
Вот enum
, реализующий интерфейс PageCounter
и предоставляющий реализации по умолчанию:
enum DefaultPageCounter implements PageCounter {
TRUENOTFULL {
@Override
public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
return FIRST.equalsIgnoreCase(whatPageNext) ? FIRST_SIZE : acctIdList.size();
}
},
TRUE {
@Override
public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
return FIRST.equalsIgnoreCase(whatPageNext) ? FIRST_SIZE : DEFAULT_SIZE;
}
},
FALSE {
@Override
public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
// some default (non)value is required here: -1 can be whatever.
return ALWAYS_FIRST.equalsIgnoreCase(whatPageNext) ? acctIdList.size() : -1;
}
};
}
Вот ваш код (намного короче в клиенте и не знает о существующих возможностях)
PageCounter counter = DefaultPageCounter.valueOf(mmPageCounter.toUpperCase());
int accountListSize = counter.getAccountListSize(whatPageNext, acctIdList);
counter
может быть предоставлен некоторым фабричным методом, чтобы вы могли переключать реализацию PageCounter
для подклассов (поэтому я все-таки решил использовать интерфейс), но я не хотел усложнять это. чем это уже есть.