Const правильность в Java, используя аннотации? - PullRequest
12 голосов
/ 06 февраля 2011

Существует ли существующая библиотека, которая позволяет мне аннотировать Java-метод как @Const, так что компилятор (используя apt, я полагаю) сообщит об ошибке, если обновит поле или вызовет не-Const метод для поле; и аннотировать параметр как @Const, чтобы принимающий метод не мог вызвать ни один из его не-Const методов или обновить любое из его полей?

(В основном, попытка добавить const-корректность в Java с помощью аннотаций; есть некоторые очевидные детали, не затронутые в вопросе выше, такие как присвоение / из параметра типа @ Const и т. Д.)

Я нашел это: http://confluence.atlassian.com/pages/viewpage.action?pageId=182158080, но кажется, что он доступен только как часть IDEA.

После запроса на разъяснение ниже приведен пример кода, чтобы показать, что я имею в виду:

class Person {
  private String name;
  private String address;

  @Const public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  ... etc. for address
}

Теперь, если я определю метод, такой как:

void processPerson(@Const Person p)

строка типа: p.getName() будет в порядке в processPerson, поскольку getName был помечен как метод @Const. Но вызов p.setName() изнутри processPerson будет помечен как ошибка.

Обратите внимание, что это очень отличается от final: если параметр был определен как final Person p, любое присвоение p было бы недопустимым, но все равно совершенно правильно изменить то, к чему относится p (либо используя p.setName(...) или даже более напрямую, с p.name = ....

Ответы [ 4 ]

8 голосов
/ 06 февраля 2011
  • JSR-305 предположительно делает то, что вы ищете

  • Лично я бы посмотрел, смогу ли я использовать Валидатор гибернации - проверка бина (JSR-303) для этого.Это замечательная небольшая библиотека (не зависит от спящего режима, она небольшая), и она делает чудеса для поддержания чистоты ваших данных.См. документацию .

  • Парень из Google также недавно начал Контракты для Java , но это еще может быть не качество производства.

6 голосов
/ 06 февраля 2011

Взгляните на Checker Framework , который в основном имеет контроллеры, которые пытаются обнаруживать программные дефекты [JSR-305] через систему аннотаций расширяемого типа [JSR-308].

У него есть средство проверки неизменности (на самом деле 2), которое позволяет аннотировать код аннотациями неизменяемости, такими как @Mutable, @Immutable и @Readonly. Этот инструмент различает неизменный экземпляр и справку только для чтения.

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

аннотировать параметр как @Const, чтобы принимающий метод не мог вызвать ни один из его не-Const методов или обновить любое из его полей?

будет выглядеть так:

void addFriend(@ReadOnly Friend friend) { this.friends.add(friend); }

позволяет мне аннотировать Java-метод как @Const, так что компилятор (используя apt, я полагаю) отметит ошибку, если обновит поле или вызовет метод не-Const для поля; и

Это будет выглядеть для примера в вопросе:

public String getName(@ReadOnly Person this) {
  return name;
}

@ReadOnly здесь указывает, что получатель (экземпляр this, метод которого вызывается) должен NOT быть изменен. Несмотря на кажущийся дополнительный параметр, метод по-прежнему вызывается как обычно:

@ReadOnly Person person = new Person();
person.getName();

0 голосов
/ 07 февраля 2011

const было в C ++. Ява, очевидно, отказалась от него специально. И теперь люди, выросшие без по-настоящему опытных const, думают, что это хорошая идея.

Как только вы пометите один метод как const, он будет распространяться как рак, довольно скоро вы обнаружите, что const почти все. Было бы лучше иметь not-const.

Совершенно бесполезно. Это только привлекательно в учебе, никому не помогает в реальном программировании.

0 голосов
/ 06 февраля 2011

Я комментирую комментарий @AlexR, это можно сделать с помощью AspectJ, что-то вроде этого:

public aspect ConstAspect{
declare warning : withincode(* *(..,@Const (*),.. ) ) : "Calling Const Method..";
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...