Требуется ли куча для хранения констант (Java объектов)? И как много? - PullRequest
0 голосов
/ 02 апреля 2020

Итак, в моей программе у меня много проверок, таких как:

return Optional.ofNullable(issuer)
    .orElseThrow(() -> new OAuth2AuthenticationException
        new OAuth2Error(code, description, null));

Итак, я начал думать о создании класса констант с примерно 6 полями, такими как:

public static final OAuth2AuthenticationException ISSUER_IS_NOT_TRUSTED_EXCEPTION =
    new OAuth2AuthenticationException(new OAuth2Error(
        INVALID_ISSUER, "Issuer is not trusted", null));

И теперь у меня есть что-то вроде:

return Optional.ofNullable(issuer)
    .orElseThrow(() -> ISSUER_IS_NOT_TRUSTED_EXCEPTION);

Мой вопрос: стоит ли игра свеч? Потому что в случае создания этих объектов каждый раз это может занять больше памяти за раз (если есть много одновременных пользователей, пытающихся получить доступ к ресурсу незаконно в momemt), но все эти объекты будут уничтожены G C .

Сколько кучи потребуется для хранения как 6 исключений, и я должен это сделать?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Помните: исключения должны использоваться только для представления исключительных вещей.

Если что-то действительно исключительное, это случается редко, поэтому дополнительные затраты на создание нового объекта усредняются по все случаи, в основном нулевые, даже если этот объект достаточно дорогой для создания.

Кроме того, исключение имеет трассировку стека, которая показывает стек вызовов, когда было сгенерировано исключение (и причина, и исключенные исключения). и др. c). Не имеет смысла хранить это как константу, если только вы (каким-то образом) не можете гарантировать, что исключение выдается в том же потоке с точно таким же стеком вызовов и т. Д. c.

Просто создайте новый объект.

Если вы используете это исключение для представления чего-то необычного, оно не является действительно исключительным. Используйте что-то еще, чтобы представить это.

0 голосов
/ 02 апреля 2020

много чеков

Что вы подразумеваете под множеством чеков? Если это происходит сотни или тысячи раз в секунду, вы захотите использовать константу. Когда вы вместо этого используете константу, ей не нужно каждый раз создавать объект. Если вы делаете это всего несколько раз, то вы можете просто сделать это другим способом.

Хорошее эмпирическое правило заключается в том, что если он используется более 10 раз (дать или взять), то просто сделайте это поле, чтобы избежать создания дополнительного объекта.

Редактировать: это также, конечно, зависит от того, насколько большой объект изначально, но для маленького объекта, как в этом случае, тогда правило стоит

...