重用 Class 级变量还是创建新的局部变量?
Reuse Class Level Variables or Create New Local Variables?
我看到这个问题被问过很多次,但方式不同,而且答案从来都不是我一直在寻找的。我确定我可以做一些测试,但我觉得这对其他人来说可能是一个很好的资源,并且可能会就此事征求一些意见。
问题是:我有一个 class 实现了一个配置接口。每个被继承的方法通常都有一个变量。最常见的是通用的 Objects.
如果这些方法被一遍又一遍地调用,是创建临时 class 级别的变量,每次调用方法时都被覆盖,还是每次都创建一个新变量更有效?
尤其是在循环中。我通常尝试将所有变量都保留在本地,但最近与我一起工作的一位程序员做了相反的事情并更改了我的一些代码,因为如果我需要进行修改,将来可以更轻松地更改它。
如果这令人困惑,这里有一个例子来说明我的意思:
// Reused Local Variable
private Object tempObject;
public char getChar(String key) {
tempObject = get(key); /* method that grabs and object from a map */
// more code...
}
// Recreated Local Variable
public char getChar(String key) {
Object tempObject = get(key);
// more code...
}
请不要将此标记为重复问题。周围有很多这样的问题,但他们都有不同的答案,差异很大。
而且我做了我的研究,所以不要说我没有。 (这似乎是这个网站上的一个大问题。你无法再得到任何帮助,因为人们很快就标记了帖子,甚至没有阅读它们只是因为它们与其他帖子相似)。
这些答案:here,声明如果您想重新格式化您的代码,您将无缘无故地为自己做更多的工作。并且根据编译器的不同,它可能会自动将代码重构为最佳用途。但是如果有多个用户在不同的编译器上编译代码,一个构建可能会更多。
这些答案:here,似乎只是在谈论在单个方法中重用一个变量。或者为不同的值或值类型重用变量。如果该值做的事情与第一个值不同,它应该有自己的名字。除非所述变量的命名是通用的并且可以用于不同的事物。 Integer 'i' 可能不是最好的重用,因为它很常见并且可以在其他地方使用,这可能会导致冲突。 'score' 之类的东西可以重复使用,只要您放入其中的值是相关且兼容的。
我将对前面提到的问题的一些答案进行稍微重述。为了可维护性,请使用局部变量。
如果您使用 local 变量,那么编辑或调试此代码的任何人(包括您自己,几个月后)都会立即知道 only 代码 在 中,您的 getChar()
方法可以更改 tempObject
的值。知道这些很有用。
另一方面,如果你把它定义为一个实例变量,那么事情就复杂多了。假设您正在考虑让 getChar
方法调用不同的实例方法(我们称之为 foo
)。然后,突然间,你不得不花时间弄清楚 foo
是否依赖于,或者 改变了 ,tempObject
的值。以及 foo
调用 的任何方法是否会更改它。等等...
可能会出现许多其他类似问题。而且我什至没有涉及线程问题。
使用局部变量可以让以后阅读代码的任何人都非常清楚确切地发生了什么 - 仅使用这里。如果把它做成实例变量,大家就得停下来想一想了。
我看到这个问题被问过很多次,但方式不同,而且答案从来都不是我一直在寻找的。我确定我可以做一些测试,但我觉得这对其他人来说可能是一个很好的资源,并且可能会就此事征求一些意见。
问题是:我有一个 class 实现了一个配置接口。每个被继承的方法通常都有一个变量。最常见的是通用的 Objects.
如果这些方法被一遍又一遍地调用,是创建临时 class 级别的变量,每次调用方法时都被覆盖,还是每次都创建一个新变量更有效?
尤其是在循环中。我通常尝试将所有变量都保留在本地,但最近与我一起工作的一位程序员做了相反的事情并更改了我的一些代码,因为如果我需要进行修改,将来可以更轻松地更改它。
如果这令人困惑,这里有一个例子来说明我的意思:
// Reused Local Variable
private Object tempObject;
public char getChar(String key) {
tempObject = get(key); /* method that grabs and object from a map */
// more code...
}
// Recreated Local Variable
public char getChar(String key) {
Object tempObject = get(key);
// more code...
}
请不要将此标记为重复问题。周围有很多这样的问题,但他们都有不同的答案,差异很大。
而且我做了我的研究,所以不要说我没有。 (这似乎是这个网站上的一个大问题。你无法再得到任何帮助,因为人们很快就标记了帖子,甚至没有阅读它们只是因为它们与其他帖子相似)。
这些答案:here,声明如果您想重新格式化您的代码,您将无缘无故地为自己做更多的工作。并且根据编译器的不同,它可能会自动将代码重构为最佳用途。但是如果有多个用户在不同的编译器上编译代码,一个构建可能会更多。
这些答案:here,似乎只是在谈论在单个方法中重用一个变量。或者为不同的值或值类型重用变量。如果该值做的事情与第一个值不同,它应该有自己的名字。除非所述变量的命名是通用的并且可以用于不同的事物。 Integer 'i' 可能不是最好的重用,因为它很常见并且可以在其他地方使用,这可能会导致冲突。 'score' 之类的东西可以重复使用,只要您放入其中的值是相关且兼容的。
我将对前面提到的问题的一些答案进行稍微重述。为了可维护性,请使用局部变量。
如果您使用 local 变量,那么编辑或调试此代码的任何人(包括您自己,几个月后)都会立即知道 only 代码 在 中,您的 getChar()
方法可以更改 tempObject
的值。知道这些很有用。
另一方面,如果你把它定义为一个实例变量,那么事情就复杂多了。假设您正在考虑让 getChar
方法调用不同的实例方法(我们称之为 foo
)。然后,突然间,你不得不花时间弄清楚 foo
是否依赖于,或者 改变了 ,tempObject
的值。以及 foo
调用 的任何方法是否会更改它。等等...
可能会出现许多其他类似问题。而且我什至没有涉及线程问题。
使用局部变量可以让以后阅读代码的任何人都非常清楚确切地发生了什么 - 仅使用这里。如果把它做成实例变量,大家就得停下来想一想了。