Что эквивалентно статическим методам в ColdFusion?

В С# я создал статические методы, чтобы помочь мне выполнить простые операции. Например:

public static class StringHelper
{
    public static string Reverse(string input)
    {
        // reverse string
        return reversedInput;
    }
}

Тогда в контроллере я бы назвал его простым использованием:

StringHelper.Reverse(input);

Теперь я использую ColdFusion с Model Glue, и я хотел бы сделать то же самое. Однако, похоже, в ColdFusion нет понятия статических методов. Если я создаю CFC следующим образом:

component StringHelper
{
    public string function Reverse(string input)
    {
        // reverse string
        return reversedInput;
    }
}

Могу ли я вызвать этот метод, создав в контроллере экземпляр StringHelper, например:

component Controller
{
    public void function Reverse()
    {
        var input = event.getValue("input");
        var stringHelper = new StringHelper();
        var reversedString = stringHelper.Reverse(input);
        event.setValue("reversedstring", reversedString);
    }
}

Или есть ли какое-то место, где я могу поставить "статические" CFC, чтобы структура создала экземпляр за кулисами, чтобы я мог использовать его, как если бы он был статичным, вроде как работает папка помощников?

Ответ 1

Нет, вы правы, в ColdFusion нет понятия статических методов. Я думаю, что большинство из них решило бы эту проблему, используя утилиты singleton в области приложения, которые создаются при запуске приложения. Итак, в вашем приложении App.cfc в onApplication вы можете:

<cfset application.StringHelper = createObject("component", "path.to.StringHelper") />

Затем, когда вам нужно было позвонить из любой точки, вы будете использовать:

<cfset reversedString = application.StringHelper.reverse(string) />

Да, это не так чисто, как статические методы. Может быть, когда-нибудь у нас будет что-то похожее на них. Но сейчас я думаю, что это как можно ближе.

Ответ 2

Один из способов создания статики в ColdFuison - это поставить функцию или переменную в метаданные объекта. Он не идеален, но, как статичный, вам не нужно создавать экземпляр объекта для их вызова, и они будут длиться до тех пор, пока сервер не будет перезапущен, поэтому они будут довольно быстрыми после первого вызова.

Вот быстрый фрагмент:

component name="Employee"
{
 public Employee function Init(){
  var metadata = getComponentMetaData("Employee"); 

  if(!structKeyExists(metadata,"myStaticVar")){

   lock name="metadata.myStaticVar" timeout="10"{
    metadata.myStaticVar = "Hello Static Variable."; 
   }
  }

  return this;
 }
}

Подробнее здесь: http://blog.bittersweetryan.com/2011/02/using-metadata-to-add-static-variables.html.