>public void testCompareTo() throws Exception
>{
> WikiPagePath a = PathParser.parse("PageA");
> WikiPagePath ab = PathParser.parse("PageA.PageB");
> WikiPagePath b = PathParser.parse("PageB");
> WikiPagePath aa = PathParser.parse("PageA.PageA");
> WikiPagePath bb = PathParser.parse("PageB.PageB");
> WikiPagePath ba = PathParser.parse("PageB.PageA");
> assertTrue(a.compareTo(a) == 0); // a == a
> assertTrue(a.compareTo(b) != 0); // a != b
> assertTrue(ab.compareTo(ab) == 0); // ab == ab
> assertTrue(a.compareTo(b) == -1); // a < b
> assertTrue(aa.compareTo(ab) == -1); // aa < ab
> assertTrue(ba.compareTo(bb) == -1); // ba < bb
> assertTrue(b.compareTo(a) == 1); // b > a
> assertTrue(ab.compareTo(aa) == 1); // ab > aa
> assertTrue(bb.compareTo(ba) == 1); // bb > ba
>}
Конечно, при этом возникает существенный риск, что пояснительный комментарий окажется неверным. Просмотрите код примера и убедитесь, как трудно проверить его правильность. Это объясняет как необходимость пояснений, так и связанный с ними риск. Итак, прежде чем писать такие комментарии, убедитесь в том, что лучшего способа не существует, и еще внимательнее следите за их правильностью.
Предупреждения о последствиях
Иногда бывает полезно предупредить других программистов о нежелательных последствиях от каких-либо действий. Например, следующий комментарий объясняет, почему конкретный тестовый сценарий был отключен:
>// Не запускайте, если только не располагаете
>// излишками свободного времени.
>public void _testWithReallyBigFile()
>{
> writeLinesToFile(10000000);
> response.setBody(testFile);
> response.readyToSend(this);
> String responseString = output.toString();
> assertSubString("Content-Length: 1000000000", responseString);
> assertTrue(bytesSent > 1000000000);
>}
Конечно, в наше время тестовый сценарий следовало бы отключить при помощи атрибута @Ignore с соответствующей пояснительной строкой: @Ignore("Слишком долго выполняется"). Но до появления JUnit 4 запись с начальным символом подчеркивания перед именем метода считалась стандартной. Комментарий, при всей его несерьезности, хорошо доносит свое сообщение до читателя.
А вот другой, более выразительный пример:
>public static SimpleDateFormat makeStandardHttpDateFormat()
>{
> // Класс SimpleDateFormat не является потоково-безопасным,
> // поэтому экземпляры должны создаваться независимо друг от друга.
> SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
> df.setTimeZone(TimeZone.getTimeZone("GMT"));
> return df;
>}
Возможно, вы возразите, что у задачи есть и более удачные решения. Пожалуй, я соглашусь с вами. Однако комментарий в том виде, в котором он здесь приведен, выглядит абсолютно разумно. По крайней мере он помешает излишне ретивому программисту использовать статический инициализатор по соображениям эффективности.