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