首页 > 解决方案 > 如果我需要在多个方法中使用相同的变量 - 我应该在类级别或本地为每个方法定义它们吗?

问题描述

我不需要更改 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'
}

标签: java

解决方案


如果它们是实常数(总是相同的值),那么你可以这样做:

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)。接下来是一个(单子),紧随其后的是两个(二元)。应尽可能避免使用三个参数(三元)。超过三个(多元)需要非常特殊的证明——无论如何都不应该使用。


推荐阅读