Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
如何在Groovy中禁用自动生成的访问器/变异器?_Groovy - Fatal编程技术网

如何在Groovy中禁用自动生成的访问器/变异器?

如何在Groovy中禁用自动生成的访问器/变异器?,groovy,Groovy,问题 无论您将字段定义为public还是private,Groovy都将通过自动创建的访问器使其可公开访问。这里有一些帖子表明,只有在您的字段未声明为私有时,才会发生这种情况。除了Groovy 2.5之外,我可以为每一个版本说话,我怀疑更高的版本,这绝对不是事实 范例 private Collection<BeanDefinition> unknownLocalBeans = new HashSet() private Collection unknownLocalBeans=ne

问题

无论您将字段定义为public还是private,Groovy都将通过自动创建的访问器使其可公开访问。这里有一些帖子表明,只有在您的字段未声明为私有时,才会发生这种情况。除了Groovy 2.5之外,我可以为每一个版本说话,我怀疑更高的版本,这绝对不是事实

范例

private Collection<BeanDefinition> unknownLocalBeans = new HashSet()
private Collection unknownLocalBeans=new HashSet()
变量unkwownLocalBeans对每个人都是可访问的,尽管我不希望任何人能够访问它,包括通过getter方法

问题


有没有办法在Groovy中获得实际的私有访问,或者禁用自动生成功能?我有一些不应该有访问器的类,如果它们可用,则会邀请开发人员做他们不应该做的事情。

在Groovy中可以访问私有成员的事实与自动生成的访问器无关。从官方角度讲,访问私有成员的能力是Groovy实现中的一个缺陷,即Groovy语言规范中没有规定您应该能够访问私有成员

然而,这个bug已经存在很长时间了,几乎被认为是一个事实上的特性。这个bug被修复的可能性很低,因为有很多程序依赖于访问私有成员的能力,如果被修复,这些程序就会崩溃

就我个人而言,我认为无法在类中封装数据是一件很遗憾的事情,但其他人不同意,他们发现访问私有成员的功能很有用,例如在编写测试时


在这种情况下,您可能无法访问用
@CompileStatic
注释的类的私有成员,但此注释引入了一些您可能不喜欢的限制。

问题不在自动生成的访问器中。groovy通过java反射对方法和属性执行动态访问的问题。java允许通过反射访问私有方法和成员。如果调用方类或方法将被注释为
@CompileStatic
,那么即使在编译过程中,private也将被限制。@daggett这是一个有趣的观点。目前正在调查,并将跟进。谢谢你的帖子。作为解决方法,创建抛出异常的getUnknownLocalBeans方法。我明白了。如果所有字段都是公共的,那么自动生成访问器有什么意义?我想我可以将其作为一个单独的问题发布。@UsmanMutawakil是的,请发布一个单独的问题,因为答案需要的不仅仅是简短的注释。