Java Secret: Using an enum to build a State machine
javacodegeeks.com
javacodegeeks.com
Also, I'm hesitant to call anything regarding enums and State Machines a "secret", no matter the language. What IS cool about Java enums, though, is that they can encapsulate behavior. Building a state machine with C# or C enums involves defining the enum and then writing a giant switch statement (often in several places) or making a generic callback registration engine.
EDIT: Are there any other languages that do cool things with enums like this? I was delighted the first time I learned you could do this in Java.
One way around this if you're in, say, C#, is to just forget enums and use a static class...
class State {
static State Init = () -> // do stuff
static State Running = () -> // do running stuff
static State Close = () -> // do closing stuff
static void NewState(State state) {
state()
}
And you can reference the states just like enums: if (someState == State.Init) // then do something with it
(I know this isn't syntactically correct C#... I haven't used the language in over a year now.)And I agree, while good knowledge, I don't think this is a secret. I remember a simpler example of this being taught in some of my intro CS classes...
As for doing this in other languages, I think Java's ability to encapsulate is pretty unique... but I'm not sure. In theory you should be able to do something similar in the "pure" OO languages (Ruby, Python, SmallTalk, etc).
Is there a similar trick for Go?
However, the concept is more naturally/idiomatically expressed in C# using an abstract class and variants (i.e. derived classes) for the various states.
This also gives you the advantage that you can encode valid state transitions in the type system itself.
But you say 'it's no secret' and admit a couple of lines later that you were 'delighted' when you first heard about this particular feature.
So - I'd like to give the author the benefit of the doubt. No, 'secret' is probably crap here, but it can be surprising and a nice revelation nevertheless.
As you might guess, I read it the first way :)
https://img.skitch.com/20110712-pff65sbxas9t89w6ecckqjq9ic.j...
edit: dear authors: if you're going to share content, share content. Not header, sidebar, adds, rss, follow me on twitter, stumble, +1, bing, like, toolbars, etc. There's a reason people fucking love readability.
http://vanillajava.blogspot.com/2011/06/java-secret-using-en...
Plus, that background picture screams "LOOK AT ME, ALL I'M DOING HERE IS CLUTTERING UP THIS PAGE EVEN MORE!!!!111one" to me.