6

我对 ColdFusion 中的构造函数有一些疑问:

  1. 我必须使用该名称init作为构造函数名称吗?
  2. 如果我在不调用 init 方法的情况下创建组件的实例,会返回什么?

    instance=createObject("组件","cfcName"); // 现在实例持有什么值

  3. 能不能把init方法里的代码取出来,把init方法删掉,然后把代码粘贴到组件的头部,是不是和init构造函数的效果一样?

十分感谢。

4

3 回答 3

14

我必须使用名称 init 作为构造函数名称吗?

不,您可以随意命名初始化函数。init()只是一个约定。它不是真正的构造函数,因为它不会自动调用。

如果我在不调用 init 方法的情况下创建组件的实例,会返回什么?

如您所料,组件实例被返回。功能的存在与否init()是完全无关的。ColdFusion 组件中没有静态函数的概念,您总是从GetObject("component", ...). (如果您忘记/没有手动操作,Java 对象就不是这样了,它们是在第一次使用之前构建的。)

能不能把init方法里的代码取出来,把init方法删掉,然后把代码粘贴到组件的头部,是不是和init构造函数的效果一样?

是的,只要init()方法不带任何参数,就没有区别。

但是,约定调用init()一个返回组件实例的方法。即使它除了“ ”之外什么都不<cfreturn this>做。我会保持一致并为每个组件添加一个,即使这不是绝对必要的。

于 2009-07-10T08:28:51.693 回答
10

Tomalak 的回答对于 ColdFusion 8 是正确的;然而,今年晚些时候发布的 ColdFusion 9 正在发生一些变化。(为了完整起见,我将复制 Tomalak 的答案并进行适当调整,因此感谢您的领先。:))


我必须使用名称 init 作为构造函数名称吗?

CF8:不,你可以为初始化函数命名任何你喜欢的名字——“init”只是一个约定。而且它不是真正的构造函数,因为它不会自动调用。

CF9:答案仍然是“不”,不必。但是您应该这样做:这适用于在 cfscript(或仅脚本组件,也将在 CF9 中出现)中创建对象。和关键字正在被添加importnew您将能够像这样创建对象的实例:

import model.security.*;
userObj = new User();

这假设您在文件夹User.cfc内有一个。model/security/此外,CF9 将查找名为“init”的方法或与对象同名的方法(在本例中为“User”)的存在,并将其隐式调用为构造函数。

我不确定将参数传递给new指令是否会将它们转发给构造函数,就像您在 Java/C 中看到的那样。我认为它会,但我还没有看到任何表示一种或另一种方式的演示文稿或代码示例;并没有自己测试它,因为它只是在写这篇文章时突然想到的。;)(另一个想法:我想知道是否会支持具有不同参数集的多个构造函数。我对此表示怀疑,但这是一个好主意。)

我假设类似的功能可能会出现在 CFML(基于标签的语言,与 cfscript 分开)中,但目前对此没有任何说法。

如果我在不调用 init 方法的情况下创建组件的实例,会返回什么?

如您所料,组件实例被返回。init() 函数的存在与否是完全无关的。ColdFusion 组件中没有静态函数的概念,您总是从 GetObject("component", ...) 获得完全构造的实例。(如果您忘记/没有手动操作,Java 对象就不是这样了,它们是在第一次使用之前构建的。)

能不能把init方法里面的代码取出来,把init方法删掉,然后把代码粘贴到组件的头部,是不是和init构造函数一样的效果?

是的,只要init() 方法不带任何参数,就没有区别。

但是,约定使用一个名为 init() 的方法返回组件实例(“this”)。即使它除了“ return this;”之外什么都不做。我会保持一致并为每个组件添加一个,即使这不是绝对必要的。

于 2009-07-10T18:20:40.640 回答
1

一些第 3 方库/框架可能期望init成为构造函数(显然,CF9 之前)。例如,我相信 ColdSpringinit会在尝试传入构造函数参数时寻找调用的方法。

作为对亚当的回答,我很确定多个构造函数不会成为 CF9 的一部分,因为这需要方法重载,我还没有听说过。通常的解决方法是利用 Duck 类型和检查参数的类型,并提供可选参数(传递命名参数的能力使得这很容易处理)。

Sean Corfield 关于 Duck Typing 的演示文稿的链接:http: //corfield.org/articles/ducktyping_cfunited.pdf

于 2009-07-12T18:07:59.750 回答