Начнем с основ, вот неофициальное определение реестра:
Но:
При этом может быть полезно понять этот класс, чтобы на данный момент эффективно работать с Tink.
Что происходит, когда вы вызываете getPrimitive()
для дескриптора набора ключей? Он перенаправляет ваш вызов в реестр 1 , который содержит объекты с конкретными методами для создания ключей и примитивов , такие как ключ AesGcm или экземпляр ChunkedMac. Задача реестра — перенаправить вызов на правильный объект. Это работает только в том случае, если объект зарегистрирован, поэтому важно всегда регистрировать примитивы, которые вы собираетесь использовать .
А что, если я использую библиотеку, в которой уже зарегистрированы нужные мне примитивы?
Проблема именно в этом. И одна из причин удаления реестра. Потому что в этом случае ваш код работает только до тех пор, пока авторы библиотеки не решат больше не регистрировать этот примитив. На этом этапе ваш код ломается, и причина неочевидна и запутанна. Поэтому всегда регистрируйте то, что вы используете . Например, если вы планируете использовать MAC в своем Java-коде, на этапе установки вам следует сделать следующее:
MacConfig.register()
Этот код гарантирует, что все необходимые объекты будут зарегистрированы в нужных местах, чтобы вы могли использовать примитив MAC.
Есть еще одна сторона этой проблемы. Некоторые из ваших зависимостей могут регистрировать вещи, которые вам на самом деле не нужны и от которых вы бы предпочли не зависеть. Это еще одна причина удалить глобальный реестр.
если быть точным, к глобальному одноэлементному экземпляру реестра классов. Мы используем имя «Реестр» как для класса, так и для синглтона, взаимозаменяемо. ↩