[Newbies] Re: Alternative for static const...

Bert Freudenberg bert at freudenbergs.de
Tue Feb 27 09:33:58 UTC 2007

On Feb 27, 2007, at 10:08 , Mispunt wrote:

> Hi all,
> For programming my Lego Mindstorms NXT I have to use codes like 16r1F.
> But I actually want to be able to use "readable" codes. In a language
> like Java I will do that with a static const, but as far as I know I
> have to do it with symbols in Smalltalk.

No, there is a better way.

If you are inside one class (or its subclasses), you would use "class  
variables", one per constant. You add them in the class template:

Object subclass: #Bla
	instanceVariableNames: ''
	classVariableNames: 'Const1 Const2'
	poolDictionaries: ''
	category: 'Bert-Bla'

and the initialization code is in a class-side #initialize method:

	"self initialize"
	Const1 := 16r1F.
	Const2 := 12345.

You need to execute the "self initialize" in the browser to do the  
initialization. It will be executed automatically when loaded into  
another image.

Class variables are capitalized because they are sort-of "global",  
they can be used in the defining class, its metaclass, and all their  
subclasses. If you need to give access to these variables across the  
class hierarchies, then you would do the same, but as a subclass of  

SharedPool subclass: #BlaConstants
	instanceVariableNames: ''
	classVariableNames: 'Const1 Const2'
	poolDictionaries: ''
	category: 'Bert-Bla'.

To use this "pool" of variables in another class, list it as a "pool  

Object subclass: #Bla
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: 'BlaConstants'
	category: 'Bert-Bla'

This makes all class variables of BlaConstants available to Bla as if  
they were class variables.

There are quite a few other ways to allow "global" variables in  
Smalltalk, but this one is the "clean" way to do it which works  
nicely with tools like Monticello.

- Bert -

More information about the Beginners mailing list