【发布时间】:2013-03-21 14:57:50
【问题描述】:
我想知道将方法声明为静态的含义是什么。我知道当声明为静态时,我可以在不实例化类的情况下使用该方法。但是我什么时候应该将一个方法声明为静态的,以及当我将一个方法声明为静态时的含义是什么。
在此先感谢您提供有关此主题的任何帮助/说明。
【问题讨论】:
标签: methods static salesforce
我想知道将方法声明为静态的含义是什么。我知道当声明为静态时,我可以在不实例化类的情况下使用该方法。但是我什么时候应该将一个方法声明为静态的,以及当我将一个方法声明为静态时的含义是什么。
在此先感谢您提供有关此主题的任何帮助/说明。
【问题讨论】:
标签: methods static salesforce
在 Salesforce 的 Apex 中使用静态方法的原因与 Java 或其他相关的面向对象语言相同。简而言之,当方法应用于一个类而不是该类的实例时,使用static。例如,我将参考not-just-yeti对问题Java: when to use static methods的回答:
在
Car类中,您可能有一个方法 doubleconvertMpgToKpl(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 方法。
【讨论】:
setMileage 将无法访问特定汽车的里程。为了访问特定汽车的数据,它需要是一个实例方法。如果是static,则意味着里程是全球所有汽车共享的东西,我们知道这不是真的。
new 实例)。哪些编译,哪些不编译?现在尝试使用new 关键字创建的类的实例,并进行相同的练习。拥有实例后,请尝试更新一个实例上的字段,然后从另一个实例中读取它。 static 关键字对这种行为有何影响?