Stateless and/or static. That’s my general rule for singletons. If an object needs to change state based on data outside of the APPLICATION or SERVER scopes, extend or use a stateful object that doesn’t persist in those scopes, it doesn’t belong as a singleton. Objects that need injected stateful objects also would be excluded. The only injected objects I would use in a singleton would be Wirebox (which persists in the application scope) or other singletons.
Examples of objects I would use as singletons:
- File service objects (spreadsheets, images, etc.)
- Data parsing or manipulation objects
- Objects which interact with static data or assets (JSON or XML files, images which would not be updated dynamically)
- Objects which interact with or manage APPLICATION or SERVER scopes
Examples of objects I would never use as singletons:
- DAO or Gateway objects or service layers that interact with those objects
- Objects that interact with user sessions, SESSION or REQUEST scopes
HTH,
Jon