1

Currently, there are only 3 possible publishers. I might want to add some more in the future:

interface NewsArticle {
    enum Publisher { NYPost, ChiTribune, LATimes }

    Publisher getPublisher();
}

I like the rigidity of using enum, but when might I get tripped-up if I treat the publisher as an enum instead of a String?

6
  • 4
    That shouldn't be an enum. Adding a publisher requires you to recompile the application. Commented Feb 11, 2016 at 21:14
  • We would need to know your choice of language and build construction for a complete answer. In some environments, recompiling your app is fine, in others, it is not good at all. Still, you should explain why you want to getPublisher() -- this seems like a code smell to me. What might you do with that information??
    – Erik Eidt
    Commented Feb 12, 2016 at 1:57
  • @ErikEidt I am writing in Java. I've got a database of news articles from which I create objects with these attributes: (1) title, (2) story, (3) publish date, (4) publisher. To reduce errors, I want to be as restrictive as possible. But, I will add more publishers in the future so I need some flexibility.
    – konishiki
    Commented Feb 12, 2016 at 3:14
  • There should be a publisher class from which you make different publisher objects. Don't use a datarow in a database as if it were an object with properties.
    – Pieter B
    Commented Feb 12, 2016 at 12:42
  • @PieterB that model is so awesome. I mean, that is how it works in the real world, right? My design was really starting to head down a dark path...
    – konishiki
    Commented Feb 12, 2016 at 14:03

4 Answers 4

3

There shouldn't generally be a need to rebuild an application when new data is introduced. If there's no need to define and implement any publisher related logic every time a new Publisher is introduced, then enum is a wrong choice.

Where exactly in your application you need to refer to a certain Publisher? Do you have some logic that's bound to the Publisher in your application? Like

if (article.getPublisher().equals(Publisher.NYPost) {
   doSomethingNyPostRelated();
}

Do you have any such references? If you don't have any, then you shouldn't have a hard coded set of Publishers, as an enum or otherwise.

I like the rigidity of using enum, but when might I get tripped-up if I treat the publisher as an enum instead of a String?

How about a Publisher class that's not an enum?

public class Publisher {
    private final int id;
    private final String name; // perhaps?
    ...
}

That would give you more rigidity than a String without being limited to only some hard coded predefined publishers. First, you would be able to control the creation, the validity and the use of Publishers. Second you would have the type safety: you wouldn't be able to pass or return a random String as a Publisher. Third, you could read a predefined set of Publishers from a database or from a configuration file, whatever is preferred:

public class PublisherRepository {
    public List<Publisher> getAllPublishers() {
         // read publishers from db or config file
    }
}

Of course you could even have your PublisherRepository return a hard coded list of Publishers at first. Changing a properly structured hard coded solution wouldn't be as difficult as replacing an enum.

1

A possible hack would be to use a "dynamic enum", which is non-standard. You read possible values from a file a load time. So it's "only" editing a text file, not recompiling. e.g.

https://dzone.com/articles/enum-tricks-dynamic-enums

I have no experience with these things so caveat emptor. Probably not worth the effort but YMMV.

4
  • 2
    You've lost compile time safety (one of the points for enums) and this is very language (and runtime) dependent as it involves picking apart the private of the class if it is tweaking the Enum. This particular implementation, however, isn't actually an Enum and thus fails at being useable for EnumSet and EnumMap - two of the very good reasons to use an Enum in Java.
    – user40980
    Commented Feb 11, 2016 at 21:49
  • @MichaelT all excellent points, they make this hack even less useful. (I upvoted your comment). Like I said, I would probably not do this myself.
    – user949300
    Commented Feb 11, 2016 at 21:52
  • I will also point out the flip side of this (if one doesn't try to pretend that this is an enum) and create some objects based on a property file that are accessible via some method. The creation of the objects would be limited to that method (so the code can't go about and create new instances of this class behind the back of other things. But don't try to pretend that it is an enum. It isn't bad if you're not trying to confuse people about what it is and implementing a too rigid interface.
    – user40980
    Commented Feb 11, 2016 at 21:58
  • If you want to do evil and wrong things to your java code: javaspecialists.eu/archive/Issue161.html
    – user40980
    Commented Feb 12, 2016 at 15:40
0

As per the comment from Robert Harvey:

That shouldn't be an enum. Adding a publisher requires you to recompile the application.

that is all I need to know.

3
  • But how often do you ACTUALLY need to add a publisher? If its not actually frequent, then its perfectly fine to lock it into an enum.
    – GHP
    Commented Feb 12, 2016 at 16:38
  • @Graham I don't know when / if I'll add a publisher. Now there are 4. Maybe I'll get up to 8. Or, maybe I won't add any.
    – konishiki
    Commented Feb 12, 2016 at 19:31
  • If you do not have a real requirement on the near horizon to add a new publisher, then I would consider it a (minor) violation of the YAGNI principle to structure the publisher code as if you need to change it frequently/smoothly at the expense of ease of coding. If I had a dime for every time I've heard a teammate say "hey I spent some extra time making this configurable!" for features that were NEVER/RARELY actually changed later on, I'd be a rich man.
    – GHP
    Commented Feb 15, 2016 at 13:41
0

There are only two ways:

One is to use external source such as files or databases and the second is recompiling.

It makes no difference if it is a String or Enum if the options reside in the code.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.