Java 没有命名常量的标准名称

Java 没有命名常量的标准名称,java,cryptography,naming-conventions,constants,Java,Cryptography,Naming Conventions,Constants,Sun决定为加密算法使用标准名称而不是命名常量,这背后有什么理由吗 Sun(现在的Oracle)似乎在中做出了明确的努力,但没有在库中提供强定义的命名常量。我理解,从跨平台的角度来看,字符串搜索方法是有利的 然而,这样做意味着编程错误被延迟到运行时,我只能看到这会使事情变得更加困难。这是为什么?我想这将允许您提出自己的非标准名称和工厂实现。(或者允许将来使用尚不存在的名称的插件)而不会导致编译错误 这还允许用户在运行时通过向编译时未知的类路径添加类来添加新的加密类。例如Cipher中使用的字符串

Sun决定为加密算法使用标准名称而不是命名常量,这背后有什么理由吗

Sun(现在的Oracle)似乎在中做出了明确的努力,但没有在库中提供强定义的命名常量。我理解,从跨平台的角度来看,字符串搜索方法是有利的


然而,这样做意味着编程错误被延迟到运行时,我只能看到这会使事情变得更加困难。这是为什么?

我想这将允许您提出自己的非标准名称和工厂实现。(或者允许将来使用尚不存在的名称的插件)而不会导致编译错误


这还允许用户在运行时通过向编译时未知的类路径添加类来添加新的加密类。

例如
Cipher中使用的
字符串
。getInstance(字符串算法)
不包含单个名称,它还包含转换。您可能会有类似于
“DES/CFB8/NoPadding”
的内容,它指示DES算法,处于密码反馈模式,8位输出不需要填充。这种组合也可以用于其他密码。因此,这已经产生了许多常数,这些常数等于
密码*模式*位大小*填充模式
。现在,您可以创建单独的枚举,但您已经可以看到它将在何处受到影响

字符串比枚举或(甚至不用)常量灵活得多。这使得添加额外的算法变得非常容易。您甚至可以添加算法并在旧软件中配置它们;只需添加一个实现给定算法的提供程序。这在从提供者和服务构建的动态框架中使用时非常重要


正如Luiggi所指出的,创建一个接受枚举并返回
密码
签名
实例的工厂非常容易。您只需对工厂进行一次测试。

可能是他们尚未解决的设计问题。您可以拥有自己的常量(可能在
枚举中)
,这些常量指向算法的名称。最好是在Oracle论坛上发布,而不是在这里发布。@LuiggiMendoza我添加了一些可能影响选择字符串而不是常量的其他原因。我很确定这是一个特性,不是问题。或者是一个具有流畅界面模式的斗牛士。@LuiggiMendoza是肯定的,尽管我个人不太喜欢这种设计模式。那么您将得到
cipherBuilder.setAlgorithm(ALGO).setMode(MODE).buildCipher()