java - 如果我需要在多个方法中使用相同的变量 - 我应该在类级别或本地为每个方法定义它们吗?
问题描述
我不需要更改 str1 和 str2 的值,因此它们是最终的。这些变量不是对象的一部分,它们只需要在 method1() 和 method2() 内部进行一些检查。
所以不要重复代码 - 可以在类级别定义它们还是应该将它们设为本地?
班级水平:
private final String str1 = "";
private final String str2 = "";
private void method1() {
// some stuff with 'str1' and 'str2'
}
private void method2() {
// some stuff with 'str1' and 'str2'
}
或本地:
private void method1() {
final String str1 = "";
final String str2 = "";
// some stuff with 'str1' and 'str2'
}
private void method2() {
final String str1 = "";
final String str2 = "";
// some stuff with 'str1' and 'str2'
}
解决方案
如果它们是实常数(总是相同的值),那么你可以这样做:
private static final String MY_CONSTANT = "give me teh codez";
如果它们在对象创建时被初始化,并且从未被修改,你可以这样做:
public class MyClass {
// This field cannot be updated after initialization
// If it needs to be, then don't declare it as final.
private final String myField;
// Note that the fields of this AnotherClass instance CAN
// be updated, only the reference to this instance cannot
private final AnotherClass anotherField = new AnotherClass();
public MyClass(String fieldValue) {
myField = fieldValue;
}
}
在这两种情况下,确实没有理由将它们保留为局部变量。
但是,如果在创建对象后计算、接收或更新值,则需要决定该值是否应该是一个字段。除了明显的设计考虑(这个值在概念上作为这个类的一个领域是否有意义?)还有务实的考虑。例如,某些类(例如大多数 Web 应用程序框架中的控制器或服务)必须是“无状态的”——它们不能在其字段中存储每个请求的状态。您经常会看到在此类类中的方法之间传递大量参数,这是一种代码异味。解决方案可能是创建一个单独的协作类,例如 Builder/Mapper/Handler/Processor,以对每个请求的数据执行部分任务。任务完成后,实例被丢弃或重置。
一般来说,方法不应该有太多的参数。1-3个参数就可以了。4-7是危险区。超过7肯定太多了。另请参阅此讨论并引用鲍勃叔叔的精彩书籍清洁代码:
函数的理想参数数量为零(niladic)。接下来是一个(单子),紧随其后的是两个(二元)。应尽可能避免使用三个参数(三元)。超过三个(多元)需要非常特殊的证明——无论如何都不应该使用。
推荐阅读
- asp.net - 未找到此页面的资源类。请检查资源文件是否存在,然后重试
- python - Python3.9 pandas 将旋转数据框保存为适当的 csv
- wordpress - WordPress dequeing/deregistering 样式不起作用
- sql - 从表中生成 Count 后需要在 Hive 中生成百分比列
- xslt-1.0 - XSLT 1.0 外部图形
- python - 组合在特定迭代中可能存在或不存在的多个数据帧
- mysql - 如何在查询中将选择行组合成新行
- ios - Firebase iOS 在后台线程上执行
- sql - 如何在 SQL Server 中使用触发器?
- ios - 如何以编程方式创建/导出自定义真字体(.ttf/font)?- IOS