# Enums vs @IntDef
###### tags: `Android Dependency`

[TOC]
# What are Enums?
They are used as items enumeration. However, we have to be aware that they classes and they take a lot of space in dex space after compiling, leaving less space for
## Disadvantages
Require ***more than twice of memory*** in comparison to constants. Do not use it unless necessary.
>[Why Enum costs so much? Click Here to check out video!](https://www.youtube.com/watch?v=Hzs6OBcvNQE&ab_channel=AndroidDevelopers)[color=lightblue]
## Advantage
Due to ART(**A**ndroid **R**un**T**ime) improvement, dex space where enums memory is stored also became possible to shrink considerably. And taking into account that the devices now has much more RAM than before, ++it is not actually affected too much++.
# What is @IntDef?
@IntDef, as well as @StringDef annotations, can **create enumerated annotations** of inter
## How to use it?
### 1. Add Dependency
```java=
implementation 'com.android.support:support-annotations:22.0.0'
```
### 2. Add static constants
**Note:** Constants cost lower than enums.
```java=
public static final int NETWORK_ERROR = 0x1;
public static final int HTTP_ERROR = 0x2;
public static final int JSON_ERROR = 0x3;
public static final int UNKNOWN_ERROR = 0x4;
public static final int RUNTIME_ERROR = 0x5;
public static final int UNKNOWN_HOST_ERROR = 0x6;
```
### 3. Set up @IntDef & @Retention
By using **@IntDef** we can assign them as annotations in:
* Variables
* Methods return type
* Parameters: If use any other than the ones mentioned in CodeException then it will not pass when writing the method call.
By using @Retention, it tells the compiler not to store annotation data in the .class file.
**Example**
```java=
package com.zc.androiddependencies.httpbase;
import androidx.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class CodeException {
public static final int NETWORK_ERROR = 0x1;
public static final int HTTP_ERROR = 0x2;
public static final int JSON_ERROR = 0x3;
public static final int UNKNOWN_ERROR = 0x4;
public static final int RUNTIME_ERROR = 0x5;
public static final int UNKNOWN_HOST_ERROR = 0x6;
@IntDef({NETWORK_ERROR, HTTP_ERROR, JSON_ERROR, UNKNOWN_ERROR, RUNTIME_ERROR, UNKNOWN_HOST_ERROR})
//Tell the compiler not to store annotation data in the .class file
@Retention(RetentionPolicy.SOURCE)
//Declares CodeError annotation
public @interface CodeError {}
//Usage Example
@CodeError
private static int error;
@CodeError
public static int getError(){
return error;
}
public static void setNetworkError(@CodeError int newError){
error = newError;
}
}
```
# Reference
* https://medium.com/default-to-open/android-then-and-now-intro-intdef-enums-bca22d5cca56
* https://riptutorial.com/android/example/15758/intdef-annotations