The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
在我的应用程序中,我在一个地方有一个new String(array,"UTF-8")
的代码,而在另一个地方也完全相同。实际上,可能我在很多地方都有这样的代码。而且每次都需要使用那个"UTF-8"
常量来从字节数组创建一个String
。如果能在某个地方定义一次并重复使用它,就像Apache Commons正在做的那样,这将非常方便;可以参考CharEncoding.UTF_8
(那里还有许多其他的静态文字)。这些人设立了一个不好的例子!public
static
的“属性”和实用类一样糟糕。
这就是我所说的具体内容。
现在,当我需要从字节数组创建一个String
时,我使用这个:
假设我想将一个String
转换成字节数组:
看起来方便,对吧?这就是Apache Commons的设计者们所认为的(在Java世界中最受欢迎但实际上非常糟糕的库之一)。我鼓励你持有不同的想法。我不能告诉你停止使用Apache Commons,因为我们目前没有更好的替代方案(尚未!)。但是在你自己的代码中,不要使用公共静态属性-永远不要。即使这段代码对你来说看起来很方便,它也是一个非常糟糕的设计。
原因很类似于具有公共静态方法的实用类-它们是不可打破的硬编码依赖关系。一旦你使用了CharEncoding.UTF_8
,你的对象就开始依赖这个数据,它的用户(你的对象的用户)无法打破这个依赖关系。你可能会说,这是你的意图,在"UTF-8"
常量的情况下,确保只使用Unicode。在这个特定的例子中,这可能是真的,但是从一个更全局的角度来看,你会发现问题。
在我们继续之前,让我向你展示我心中的替代方案。这是我建议的将字节数组转换为String
的方法:
这是伪代码,因为Java设计者将类String
设为final,我们无法真正扩展它并创建UTF8String
,但你可以理解这个概念。在真实世界中,它可能是这样的:
如您所见,我们在UTF8String
类的某个地方封装了常量”UTF-8”,而其用户并不知道这个“字节数组到字符串”的转换是如何进行的。
通过引入UTF8String
,我们解决了”UTF-8”字面量重复的问题。但我们以一种适当的面向对象的方式解决了它—我们将功能封装在一个类中,并让每个人实例化其对象并使用它们。我们解决了功能重复的问题,而不仅仅是数据重复。
将数据放入一个共享位置(CharEncoding.UTF_8
)并不能真正解决重复问题;实际上,它使问题变得更糟,主要是因为它鼓励每个人使用相同的共享数据来复制功能。
我在这里的观点是,每当您发现应用程序中存在某些数据重复时,开始思考您正在复制的功能。您很容易找到一遍又一遍重复的代码。为这段代码创建一个新的类,并将数据作为私有属性(或私有静态属性)放在那里。这样,您将改善设计,并真正消除重复。
附注:您可以使用方法代替类,但不能使用静态字面量。
附注2:您也可以使用枚举,但只能按照这种方式使用。
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 17:08