Skip to main content

Android : Enums Vs Magic Constants

I was recently introduced to IntDef and StringDef interfaces by a co worker. I was using enums to maintain a list of constants for some purpose and he suggested me to use these interfaces. I went ahead to read more on that and would be sharing here what I learned.


So, it turns out that enums often require more than twice as much memory as static constants (quoted from andev docs). They are class objects, so :


  • A single reference to an enum constant occupies 4 bytes
  • Every enum occupies space that is the sum of all its fields’ sizes and overhead of an object
  • the class itself occupies some space.

Whereas constants require fixed space, 4 bytes in case of an int constant and (num of chars) * 1 bytes in a string constant.


That said, we can replace enums with constants only in cases where we are just using them as constants. In cases where we are


  • storing more (or complex data) data in enums, or
  • using method overloading (every enum constant can have it’s own implementation of a method)

we’ll have to go with enums.


Now, I’ll be explaining how to use these interfaces.


We declare them as following :




    @StringDef({NotificationAction.DISPLAYED, NotificationAction.CONTENT_CLICKED,
        NotificationAction.ACTION_CLICKED, NotificationAction.DISMISSED})
    @Retention(RetentionPolicy.SOURCE)
    public @interface NotificationAction {
        String DISPLAYED = "Displayed";
        String CONTENT_CLICKED = "ContentClicked";
        String ACTION_CLICKED = "ActionClicked";
        String DISMISSED = "Dismissed";
    }

That’s it ! Now you can directly use them for annotating fields or method parameters in your code.


Fields :


@NotificationAction String action;

action = "dummy" // doesn't work
action = NotificationAction.DISPLAYED; // works

Methods :


public void actOnAction(@NotificationAction action){}

actOnAction("dummy") // doesn't work
actOnAction(NotificationAction.DISMISSED) // works

This way, it also makes it convenient to allow only certain values at these places.


It won’t improve your app’s performance by a significant bit but yeah, small things like this do count.


Let me know in case of any doubts.


Cheers !


Ref : http://stackoverflow.com/questions/29183904/should-i-strictly-avoid-using-enums-on-android

Comments

Popular posts from this blog

Android : AbsSavedState cannot be cast to $SavedState

Android AbsSavedState cannot be cast to $SavedState I came across a strange crash today. This is the stacktrace : Fatal Exception: java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ScrollView$SavedState at android.widget.ScrollView.onRestoreInstanceState(ScrollView.java:1810) at android.view.View.dispatchRestoreInstanceState(View.java:14768) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3123) at android.view.View.restoreHierarchyState(View.java:14746) at android.support.v4.app.Fragment.restoreViewState(SourceFile:470) at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1326) at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(SourceFile:2323) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(SourceFile:2136) at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(SourceFile:2092) at androi...

Android Tip : Handling back button in Fragments

Android Tip : Handling hardware back button in Fragment and DialogFragment This post explains how to handle hardware back button in a Fragment OR DialogFragment . In DialogFragment, it’s quiet straight forward to achieve this. You’ve to get the dialog instance and set onKeyListener on it : if (getDialog() != null ) { getDialog().setOnKeyListener( new DialogInterface.OnKeyListener() { @Override public boolean onKey (DialogInterface dialog, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { Timber.i( "hardware back button pressed" ); } } }); } This can be done in the onViewCreated callback. For fragments, this method doesn’t work and fragments doesn’t have a direct callback to catch this event. So in this case, the approach that we follow is : You...

Android Material Showcase View - Part 1

In this series, I'll be talking about a library which is used by a lot of android developers for showcasing their in-app content,  MaterialShowcaseView . I used this library sometime back for my work and had to modify it to fit my needs. In this process, I ended up digging it a lot and would like to share what I learned. The original library offers a fix set of features, which are demonstrated by the screenshots in the README. Let's jump on the technicalities right away. The original library offers two things : 1) highlighting a view ( see the README to know what I mean by highlighting here) 2) showing a content box that tells user what the highlighted view is about. Here's how it does this : The library adds a direct view child ( this class ) in the window decor view, so that it's drawn on top of your activity's view ( here ). Then, for drawing the overlay and highlighting our view, it overrides the `onDraw()` method of this view and uses android...