Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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
Java 标记不读取/写入实例状态的方法_Java_Defensive Programming - Fatal编程技术网

Java 标记不读取/写入实例状态的方法

Java 标记不读取/写入实例状态的方法,java,defensive-programming,Java,Defensive Programming,我已经看到,有时类中不依赖于实例状态的方法被标记为static。我发现它非常清楚,因为它宣称“此方法独立于实例状态”。在检查状态不一致的可能性时,很容易完全跳过该方法 但是,将方法标记为静态的问题是静态方法不能被继承或重写 这里讨论了类似的内容: 有注释来声明非静态方法是状态独立的,这有意义吗?然后编译器可以验证它是否只使用其他与状态无关的方法 管道中是否有此类功能 java中没有这样的机制。即使是static也不能涵盖所有情况。静态方法仍然可以更改静态上下文中的状态 class Example

我已经看到,有时类中不依赖于实例状态的方法被标记为
static
。我发现它非常清楚,因为它宣称“此方法独立于实例状态”。在检查状态不一致的可能性时,很容易完全跳过该方法

但是,将方法标记为静态的问题是静态方法不能被继承或重写

这里讨论了类似的内容:

有注释来声明非静态方法是状态独立的,这有意义吗?然后编译器可以验证它是否只使用其他与状态无关的方法


管道中是否有此类功能

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

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


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

当然会。这就是为什么C++有常数的原因。也许您想检查是否有人在java社区进程中输入了请求;若否,;开始;-)。。。但严肃地说,关于静态的另一种观点是:它是OO中的一种异常。除了您提到的问题之外,静态调用还会导致更紧密的耦合;以及更难测试的代码。因此,问题是:你尽可能避免它。@ GooCAT注意到这和C++的CONST不同,这基本上提出了可重写/虚拟静态方法。当我将两个参数传递给一个方法并得到一个返回值时,有时我想确保(1)该方法只使用来自该类的这两个输入,(2)它不会以任何方式改变状态。非常感谢。这几乎正是我想要的。我想知道为什么它不是Java语言的核心特性。我希望它能在某种程度上融入语言。顺便问一下,你对此有什么建议吗:是的,这将是一个有用的功能。Martin Odersky在他关于scala路线图的演讲中提到,在将来的某个时候,它将有一个有效的系统,该系统将对函数签名中的副作用进行编码。但我根本不指望java会有这样的变化,我已经推迟了Scala这么长时间了。我想我应该试试。我只是喜欢它,当你不必看你的代码的一部分,因为它被标记为安全。同样的原因,我们更喜欢使用不可变集合,或标记字段最终等。谢谢。