2016-07-30 19 views
1

我看到有时类中不依赖实例状态的方法被标记为static。我发现它很明显,它宣称'这种方法独立于实例状态'。当审查状态不一致的机会时,完全忽略该方法是很容易的。不读取/写入实例状态的标记方法

但是,将静态方法标记为静态方法的问题是无法继承或覆盖静态方法。

像这样的事情在这里讨论:Does it make sense to have a non static method which does not use an instance variable?

会是有意义的有一个注释来声明非静态方法是状态无关?然后编译器可以验证它只使用其他独立于状态的方法。

管道中是否有这样的功能?

+1

当然会。这就是为什么C++有* const *的原因。也许你想检查是否有人在java社区过程中发出请求;如果不;启动它;-)但严重 - * static *上的另一个视图是:这是OO内的异常。除了你提到的问题之外,静态调用还会导致更紧密的耦合;和更难测试的代码。所以重点是:你尽可能避免它。 – GhostCat

+1

@GhostCat请注意,这与C++ const不同,这基本上提出了可覆盖/虚拟静态方法。 – hyde

+0

@hyde是的......当我向方法传递两个参数并获得一个返回值时,有时候我想确保(1)该方法仅使用这个类中的这两个输入,(2)它不以任何方式改变状态。 – Teddy

回答

1

java中没有这样的机制。即使是static也不涵盖所有情况。静态方法仍然可以在静态上下文中改变状态。

class Example { 
    static int counter = 0; 
    static int add(int a, int b) { 
     counter++; 
     return a + b; 
    } 
} 

但是有一些研究使用静态分析来解决这个问题。看起来像JPure有一个工作原型

+0

非常感谢。这几乎就是我正在寻找的东西。我想知道为什么它不是Java核心语言功能。我希望它能在某些时候融入到语言中。顺便说一句,你会有这样的建议:http://stackoverflow.com/questions/23995683/improvement-of-package-private-classes-in-java – Teddy

+0

是的,这将是有用的功能。马丁奥德斯基在他的演讲中提到了斯卡拉路线图,在未来的某个时间点,它将具有将在函数签名中编码副作用的效果系统。但我根本不期望在java中有这样的改变。 –

+0

我一直在望着斯卡拉这么久。我想我应该尝试一下。当您不必查看代码的一部分时,我就喜欢它,因为它标记为安全。同样的原因,我们喜欢使用Immutable集合,或标记字段最后等谢谢。 – Teddy