Статьи

Неэффективная Java

Возможно, меня заменит робот для проверки кода. Есть некоторые отзывы, которые я повторяю снова и снова. Вот некоторые из моих наименее любимых:

Общая структура кода

Брось остальное

Когда if заканчивается return else является излишним и создает ненужные отступы.

01
02
03
04
05
06
07
08
09
10
11
if (foo) {
   return bar;
} else {
   return baz;
}
 
// should be replaced by
if (foo) {
   return bar;
}
return baz;

Массив -> Список -> Поток

1
2
3
4
5
6
List< ... > list = Arrays.asList(someArray);
list.stream(...)
 
// should be replaced by
 
Arrays.stream(someArray)

Тестовый код

Прежде чем это тяжелый инициализатор

Мы используем метод @Before для настройки сложных объектов, часто там, где нам нужно выполнить обработку, чтобы вычислить, что член экземпляра класса должен иметь в нем. На другом конце спектра это перебор:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
// this is part 1 of two
private MyService myService;
 
@Before
public void before() {
    // now initialize
    myService = new MyService().init(123);
}
 
// the above code can be expressed in the initializer
// and is simple to read there...
// if it threw exceptions or needed some more complex
// set up, it wouldn't be
 
// it's in one clear place where we know where to
// find it
private MyService myService = new MyService()
    .init(123);

Тестовые броски

01
02
03
04
05
06
07
08
09
10
11
12
@Test
public void someTest()
    throws IOException, JsonException {
}
 
// never bother with multiple or specific exception
// throws in tests nobody cares and it's just noise
// the test runner will catch anything!
 
@Test
public void someTest() throws Exception {
}

AssertJ для размера

1
2
3
4
5
// long-winded
assertThat(list.size()).isEqualTo(2);
 
// should be
assertThat(list).hasSize(2);

AssertJ для всего

Встроенные утверждения JUnit не так богаты, как предоставляемые AssertJ. Как минимум, я рекомендую использовать некоторую форму assertThat , чтобы в конечном итоге вы не использовали утверждение, которое немного слабовато для ситуации.

Ваш assertEquals — неправильный путь

В 60% случаев, когда я assertEquals код с assertEquals , порядок неверный. Подсказка: используйте AssertJ !!! Юнит не прав в этом! Мы должны читать слева направо.

1
2
3
4
5
// wrong:
assertEquals(something.getFoo(), 123);
 
// it's expected IS actual
assertEquals(123, something.getFoo());

Mockito Static Imports

1
2
3
4
5
// this is not normal
Mockito.verify(mock).called();
 
// static import all mockito methods
verify(mock).called();

Mockito Times (1)

1
2
3
4
5
6
7
// this is a tautology
verify(mock, times(1)).called();
 
// look at what verify(mock) does internally
// replace with
 
verify(mock).called();

Смотрите оригинальную статью здесь: Неэффективная Java

Мнения, высказанные участниками Java Code Geeks, являются их собственными.