0

我没有编程经验,但我想知道通过方法设置变量之间有什么区别。

前任:

void setShowFPS(boolean b){
    this.showFps = b;
}

与仅调用变量

showFps = false;
4

5 回答 5

1

通常,您的类变量最好是私有的,这意味着它们不能被设置,除非通过变量所属的类的方法和构造函数。使用方法设置变量(这些方法称为setters)的优点是您可以在方法内提供验证逻辑。

例如,如果你的类中有一个变量应该代表一天中的小时,你只希望它保持一个 0 到 23 的值。你的 setter 可以在方法的用户尝试的任何时候抛出异常将变量设置为此范围之外的任何值。

于 2013-09-28T23:54:18.490 回答
1

一般来说,最好不要让你的变量暴露给课堂外的用户。方法为您提供了更多控制 - 例如,如果您想在布尔变量设置为 时触发事件true,您可以在方法中执行此操作,但在设置变量时无法执行此操作:

void setShowFPS(boolean b) {
    this.showFps = b;
    // Trigger the event
    if (b) {
        OnFpsSet();
    }
}

此外,C# 为您提供与方法一样多的控制和封装的属性,它们在外部看起来像变量。使用属性而不是单参数设置方法更惯用:

bool _ showFps;
bool showFps {
    get {
       return _showFps;
    }
    set {
       _showFps = value;
    }
}
于 2013-09-28T23:55:36.437 回答
0
void setShowFPS(boolean b){ this.showFps = b; }

这是一个相对简单的过程。例如,假设您有一个类型double为 的字段,它必须有一个奇数部分。您将设置showFps为私有,然后通过直接 getter 和验证 setter 访问它(此处以 Java 语法显示):

void setF(double f_) throws IllegalArgumentException { 
    int ip=(int) f;
    if(ip%2!=1) throw new IllegalArgumentException();
    this.f = f_; 
}

Setter 可以做一些事情,比如更新间接受影响的其他字段(例如最后更改时间戳)。无论如何,例如,如果您必须更新内部代码以使用 BigInteger,那么通过外部双精度获取和设置的能力可以防止您的类的用户破坏您的更改。

C# 可能会为此使用属性。

于 2013-09-28T23:54:25.527 回答
0

这一切都基于encapsulationabstraction概念:将数据和代码组合/绑定在一起,这样您的代码就不会被意外更改。使变量私有/无法直接被外部访问可以防止数据的意外修改(反过来通过提供getter/setter/methods来访问数据)。 NOTE: 面向对象编程更多地面向数据而不是代码。

于 2013-09-28T23:55:38.970 回答
0

我假设您的意思是为什么要封装私有变量?

有几个原因:

  1. 验证逻辑 - 使用显式设置器,您可以控制字段可以设置的值的有效范围。如果有人试图设置无效值,您可以抛出异常。

  2. 隐藏对象如何实现其契约。这使您可以更改类以后的工作方式,而不会破坏依赖于您的实现的其他代码。

  3. 以原子方式执行多次更新。更复杂的操作可能无法“同时”完成。通过使用同步和锁定机制,您可以在多线程环境中实现安全发布。

于 2013-09-28T23:56:45.210 回答