The page crashed in Chrome, fyi (EDIT: once. I think it was an ad that was served).
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).
Since a function is just an object with a single 'apply' method, I agree with the spirit of your code.
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.
No offense, in general I'm in agreement with your post.
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.
I think it depends on how you read the "secret" part of the headline. If he means "here's a secret: use enums for state machines in Java", then it's no secret at all. If he meant "here's a secret for how to better implement state machines in Java", then yes, I would call it a secret.
The secret part is that enums are under utilised even though they have been around since 2004. I would assume that many people don't realise how theyc an be used. Its no secret they exist. ;)
Using this approach could be more logical, esp as the number of methods per state increases. As you have more complex events and you want to group as State/Method rather than Method/State this approach is more appealying.
Lex() returns a token. Examples of tokens might be identifiers, string constants, integers, floats or operators. In my compiler class we learned just returning the char value of operators from lex(). It saves you the trouble of defining a enum for all those values.
The website is so distracting I couldn't even pay attention to the content. Not only is there a bloody ad in the middle of the first paragraph forcing the text to wrap around the ad, but at most 15% of the above the fold site is actual content. Swaths of the page are devoted to really nothing at all (enormous header and sidebar), ads, and useless whitespace. And are the pennies the author gets for running ads like that really worth making the site look like shit?
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.
In a state machine, all the state should be in the context rather than the code blocks. The Java Tutorial on enums talks about fields and constructors.
17 comments
[ 3.4 ms ] story [ 45.6 ms ] threadAlso, 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...
And you can reference the states just like enums: (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.