关于ColdFusion组件构造函数名称的问题

时间:2009-07-10 07:41:29

标签: coldfusion constructor init

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

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

    实例= CREATEOBJECT( “部件”, “cfcName”); //现在实例的值是多少

  3. 我可以将init方法中的代码删除并删除init方法,然后将代码粘贴到组件的头部,它是否与init构造函数具有相同的效果?

  4. 非常感谢。

3 个答案:

答案 0 :(得分:14)

  

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

不,您可以按照自己喜欢的方式命名初始化函数。 init()仅仅是一个惯例。它不是真正的构造函数,因为它不会自动调用。

  

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

返回组件实例,正如您所期望的那样。 init()函数的存在与否完全无关紧要。 ColdFusion组件中没有静态函数的概念,您始终可以从GetObject("component", ...)获得完全构造的实例。 (对于刚刚在第一次使用之前构建的Java对象,如果您忘记/不手动执行,则不是这样。)

  

我可以将init方法中的代码删除并删除init方法,然后将代码粘贴到组件的头部,它是否与init构造函数具有相同的效果?

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

但是,有一个名为init()的方法可以返回组件实例。即使除了“<cfreturn this>”之外它 也是如此。我会保持一致,并为每个组件添加一个,即使它不是绝对必要的。

答案 1 :(得分: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;”之外什么都不做。我会保持一致,并为每个组件添加一个,即使它不是绝对必要的。

答案 2 :(得分:1)

某些第三方库/框架可能期望init成为构造函数(显然,在CF9之前)。例如,我相信ColdSpring在尝试传递构造函数参数时会查找名为init的方法。

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

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