Реестр

Начнем с основ, вот неофициальное определение реестра:

Но:

При этом может быть полезно понять этот класс, чтобы на данный момент эффективно работать с Tink.

Что происходит, когда вы вызываете getPrimitive() для дескриптора набора ключей? Он перенаправляет ваш вызов в реестр 1 , который содержит объекты с конкретными методами для создания ключей и примитивов , такие как ключ AesGcm или экземпляр ChunkedMac. Задача реестра — перенаправить вызов на правильный объект. Это работает только в том случае, если объект зарегистрирован, поэтому важно всегда регистрировать примитивы, которые вы собираетесь использовать .

А что, если я использую библиотеку, в которой уже зарегистрированы нужные мне примитивы?

Проблема именно в этом. И одна из причин удаления реестра. Потому что в этом случае ваш код работает только до тех пор, пока авторы библиотеки не решат больше не регистрировать этот примитив. На этом этапе ваш код ломается, и причина неочевидна и запутанна. Поэтому всегда регистрируйте то, что вы используете . Например, если вы планируете использовать MAC в своем Java-коде, на этапе установки вам следует сделать следующее:

MacConfig.register()

Этот код гарантирует, что все необходимые объекты будут зарегистрированы в нужных местах, чтобы вы могли использовать примитив MAC.

Есть еще одна сторона этой проблемы. Некоторые из ваших зависимостей могут регистрировать вещи, которые вам на самом деле не нужны и от которых вы бы предпочли не зависеть. Это еще одна причина удалить глобальный реестр.


  1. если быть точным, к глобальному одноэлементному экземпляру реестра классов. Мы используем имя «Реестр» как для класса, так и для синглтона, взаимозаменяемо.