Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在定义变量的类中使用getter和setter?_C#_Java - Fatal编程技术网

C# 在定义变量的类中使用getter和setter?

C# 在定义变量的类中使用getter和setter?,c#,java,C#,Java,我一直在读关于能手和二传手的书,我有一个问题。访问声明变量的类中的变量时是否应该使用getter和setter?这里似乎不需要getter和setter,因为变量是私有的并不重要,声明它的类将始终可以访问它 或者getter和setter只应该在外部类想要访问这些变量时使用吗?虽然语言不要求您这样做,但在访问通过getter和setter公开的私有字段时使用getter和setter是一种很好的做法。在某些情况下,我甚至会说,即使对于没有直接暴露的内部属性,使用它们也是有意义的 这样做是一种好的

我一直在读关于能手和二传手的书,我有一个问题。访问声明变量的类中的变量时是否应该使用getter和setter?这里似乎不需要getter和setter,因为变量是私有的并不重要,声明它的类将始终可以访问它


或者getter和setter只应该在外部类想要访问这些变量时使用吗?

虽然语言不要求您这样做,但在访问通过getter和setter公开的私有字段时使用getter和setter是一种很好的做法。在某些情况下,我甚至会说,即使对于没有直接暴露的内部属性,使用它们也是有意义的

这样做是一种好的做法,因为它将读取和修改私有字段的代码隔离为一组方法。这样以后就可以提供额外的验证,甚至可以更改属性在内部的存储方式,而无需更改太多位置

更改的一个示例可能是通过getter(accessor)/setter(mutator)方法公开某个属性的类,该属性最初存储为该类中的私有字段。后来,您意识到需要为该属性使用不同的存储库—可能从文件或数据库等中读取该属性。此时,如果您仅使用这些方法访问和修改该属性,则只需更改访问器和mutator方法的代码即可实现更改

另一个例子是扩展类时的实例。它提供了更好的封装

甚至对于测试,抽象访问逻辑属性的私有“存储库”也是有意义的

注意:我指的是作为类的属性公开的私有成员的概念,尽管Java不一定将它们作为属性引用


最后,我要强调的是,我建议使用方法而不是直接访问私有成员,这是一个建议。很多人认为这是一种很好的做法,因此我建议你遵循,但如果你有充分的理由不遵循,请不要拘泥于此

简单的答案是:由你决定

有一种学派认为,您应该始终使用访问器,并且只能直接访问访问器中的变量,而不能超出它。这可以确保在访问器中实现的任何内容都能可靠地触发

还有一个学派认为,访问者是为了你们班的公共合同而存在的,而在你们班内部,你们可以自由地做你们想做的事情。有时,您可能希望在不触发在访问器中实现的任何其他内容的情况下设置值

(几年前,曾经有一个争论,关于在实际上“不需要”的地方使用访问器的性能方面,但对于今天的JIT编译方法等,这不再是一个因素。)

这取决于

如果getter或setter不是final,并且打算在潜在的子类中重写它,那么甚至可以从类本身调用它,以避免绕过子类添加到访问器的附加行为


例如,假设一个子类希望在每次更改某个属性时触发一个事件。为此,它将重写此属性的setter。但是,如果超类的其他方法直接修改属性,而不使用setter,则不会触发事件。在这种情况下,使用基类中的setter是有意义的。

没有简单的答案。取决于访问者的工作。如果他们只是在那里访问变量,那么这并不重要。。。如果它们执行一些逻辑,那么这取决于您是否希望在类中使用该逻辑

有很多示例表明,您不希望从类内部使用属性访问变量,但不允许外部实体在不通过属性访问器的情况下访问该变量


也就是说,我的看法是:除非你有充分的理由不去检查访问器的逻辑,否则就使用它们。

这也可能取决于你工作的环境。例如,如果您在Android环境中进行Java编程,则鼓励直接访问,而不是使用getter/setter。在其他环境中,可能会鼓励getter/setter进行可维护性

来自Android开发者文档

避免使用内部getter/setter

在C++等母语中,使用吸气剂是常见的做法(例如)。 i=getCount()),而不是直接访问字段(i=mCount)。 对于C++来说,这是一个极好的习惯,因为编译器通常可以 内联访问,如果需要限制或调试字段访问 您可以随时添加代码

在Android上,这是个坏主意。虚拟方法调用非常昂贵, 比实例字段查找更重要。这样做是合理的 通用的面向对象编程实践,具有getter和 在公共接口中,但在类中,您应该始终 直接访问字段

如果没有JIT,直接字段访问比调用 琐碎的获取者。使用JIT(直接现场访问与 直接现场访问速度约为本地访问速度的7倍 调用一个微不足道的getter。这在Froyo中是正确的,但在 当JIT内联getter方法时的未来


在类中,我使用私有成员。如果我需要在类中运行访问器中的额外逻辑,那么我将它们移入另一个。助手、内部、家长、任何人