【问题标题】:When to declare a method as static in Salesforce何时在 Salesforce 中将方法声明为静态
【发布时间】:2013-03-21 14:57:50
【问题描述】:

我想知道将方法声明为静态的含义是什么。我知道当声明为静态时,我可以在不实例化类的情况下使用该方法。但是我什么时候应该将一个方法声明为静态的,以及当我将一个方法声明为静态时的含义是什么。

在此先感谢您提供有关此主题的任何帮助/说明。

【问题讨论】:

    标签: methods static salesforce


    【解决方案1】:

    在 Salesforce 的 Apex 中使用静态方法的原因与 Java 或其他相关的面向对象语言相同。简而言之,当方法应用于一个类而不是该类的实例时,使用static。例如,我将参考not-just-yeti对问题Java: when to use static methods的回答:

    Car 类中,您可能有一个方法 double convertMpgToKpl(double mpg),它是静态的,因为有人可能想知道 35mpg 转换为,即使没有人制造过汽车。但作废 setMileage(double mpg)(它设置了一个特定的效率 Car) 不能是静态的,因为调用方法是不可想象的 在构造任何 Car 之前。

    有关更多示例,请参阅: Java: when to use static methods

    更新: 如果你从 Salesforce 开始编程和 OO 设计,我意识到上面的这个例子可能有点抽象,所以让我用来自built-in Apex TimeZone class 的例子重新表述一下:

    如您所料,这个类代表世界各地的时区。此类的实例(即TimeZone 对象)表示各个命名的时区(例如 EST、CST、PST 等)。请注意这里的区别——class 定义了一般的时区(例如,具有特定小时数的时间偏移的地球的定义区域),但是 的实例类(即object)定义了一个特定的时区。例如,PST 的实例将包含有关其自身的数据,如displayName = "Pacific Standard Time"offset = -8,您可以分别通过其instance 方法getDisplayName()getOffset() 访问这些数据。另一方面,如果您想获取有关时区的一般信息,您可以在TimeZone 类上使用static 方法。例如,Apex 在 TimeZone 类上定义了一个名为 getTimeZone()static 方法,您可以使用它来按 id 查找 TimeZone 实例。综上所述,请考虑以下示例以获取 PST 的显示名称:

    TimeZone pst   = TimeZone.getTimeZone('PST');  // static method call
    String pstName = pst.getDisplayName();         // instance method call
    

    注意第一行是如何获取 TimeZone 的实例,其中包含有关 PST 的特定信息,然后第二行实际上是获取该信息。

    希望这可以澄清事情并且不会使事情变得更加混乱。总而言之,如果您正在访问数据或对特定数据实例做某事,无论是汽车还是时区,您都需要使用实例方法。另一方面,如果您正在访问数据或对整类数据进行操作,无论是汽车还是时区,您都需要使用static 方法。

    【讨论】:

    • 感谢您的回复。很抱歉,所以在上面的 Class Car 示例中,我为什么不能将方法 setMileage 声明为静态?
    • 因为setMileage 将无法访问特定汽车的里程。为了访问特定汽车的数据,它需要是一个实例方法。如果是static,则意味着里程是全球所有汽车共享的东西,我们知道这不是真的。
    • 我刚刚用一个额外的例子更新了我的答案;希望这能把事情弄清楚一点。
    • 您好,非常感谢您的解释。我想我终于开始理解实例方法和静态方法之间的区别了。如果我弄错了,请纠正我,但是只有当您想对整个类进行更改时,才会将方法声明为静态。这也意味着使用此方法的任何其他类的值将更新。但是,如果将一个方法简单地声明为“public void myMethod”,因为对类的任何更改只会影响该实例,而不是整个类。
    • 是的,这非常正确。要真正让它融入其中,我建议使用一些静态和实例字段/方法创建一些虚拟类,然后尝试使用该类并查看它的行为方式。例如,尝试直接在类上调用字段/方法(不创建new 实例)。哪些编译,哪些不编译?现在尝试使用new 关键字创建的类的实例,并进行相同的练习。拥有实例后,请尝试更新一个实例上的字段,然后从另一个实例中读取它。 static 关键字对这种行为有何影响?
    猜你喜欢
    • 2014-11-09
    • 2014-05-12
    • 1970-01-01
    • 2014-07-22
    • 2012-06-29
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多