Usually, I wrote my own getters and setters. It's kind of habit since the introduction of <cfcomponent>...</cfcomponent>. However, it took time and made the code longer. So, I decided to try implicit getters and setters by setting accessors="true" and using <cfproperty />. There are two important things that I found:
- We can override implicit getters and setters with our own. However, the implementation has to be both (getter and setter). It cannot be only either getter or setter only.
- The getter and setter attribute in <cfproperty /> is to limit access if they can be called from inside only. Setting getter/setter to false mean the method cannot be called from outside the component. It does not mean to generate or not to generate getter/setter for that property.
AcmeService.cfc
<!--- Enable implicit getters and setters --->
<cfcomponent output="false" accessors="true">
<!--- Override its getter and setter. See getDelay() and setDelay(). --->
<cfproperty name="delay" type="numeric" />
<!--- Use its implicit getter and setter --->
<cfproperty name="text" type="string" />
<cffunction name="init" output="false">
<!--- Set initial values --->
<cfset THIS.setDelay(0) />
<cfset THIS.setText("Hi again.") />
<cfreturn THIS />
</cffunction>
<cffunction name="echo" output="false" hint="Echoes back whatever received.">
<cfargument name="data" required="true" />
<cfset sleep(THIS.getDelay()) />
<cfreturn ARGUMENTS.data
& " This process was delayed for " & (THIS.getDelay() / 1000) & " seconds."
& " Another property with implicit getter/setter: " & THIS.getText() />
</cffunction>
<!--- While accessor="true" creates implicit getters/setters, we can override them.
However, the implementation has to be one set (getter and setter).
It cannot be only getter or setter. --->
<cffunction name="getDelay" output="false" returntype="numeric">
<cfreturn THIS.delay />
</cffunction>
<cffunction name="setDelay" output="false" returntype="void" hint="Sets delay in seconds.">
<cfargument name="delay" type="numeric" required="true" />
<cfset THIS.delay = ARGUMENTS.delay * 1000 />
</cffunction>
</cfcomponent>
Reference: Implicit Get and Set Functions