很多人提到封装实现的细节,对我来说这是在类中使用 getter 和 setter 的最大原因。有了这个,您还可以获得许多其他好处,包括能够随心所欲地抛弃和替换实现,而无需触及使用您的类的每一段代码。在一个小项目中,这不是一个很大的好处,但如果您的代码最终成为一个使用良好的(内部或公共)库,它可能是一个巨大的好处。
一个具体的例子:数学中的复数。有些语言将它们作为语言或框架功能,而另一些则没有。我将在这里使用一个可变类作为示例,但它也可以很容易地成为不可变的。
复数可以a + bi
用实部和虚部写在表格上,非常适合[gs]etRealPart
和[gs]etImaginaryPart
。
然而,在某些情况下,在极坐标上更容易推理复数re^(iθ)
,给出[gs]etRadius
(r) 和[gs]etAngle
(θ)。
您还可以公开方法,如[gs]etComplexNumber(realPart, imaginaryPart)
和[gs]etComplexNumber(radius, angle)
。根据参数类型,这些可能需要也可能不需要不同的名称,但是类的使用者可以根据需要使用其中任何一个。
这两种形式可以互换;您可以相当轻松地从一个转换到另一个,因此该类用于内部存储的形式与该类的消费者无关。但是,消费者可以使用任何一种形式。如果您选择 a+bi 作为内部表示形式,并使用字段而不是 getter 和 setter 来公开它,那么您不仅会强制类消费者使用该形式,而且以后也不能轻易改变主意并将内部表示替换为re^(iθ) 因为这在您的特定场景中更容易实现。你被你定义的公共 API 卡住了,它要求使用特定的字段名称来公开实部和虚部。