- Java Constants — using Class, Interface, Static Imports
- 1. Define a Constants class
- 2. Define a Constants interface and implement it
- 3. Use Java static imports
- Written by Veerasundar
- Get The Constant Values From A Given Class
- Source: (ConstantValues.java)
- Output:
- Константы в Java на примерах
- Синтаксис
- Пример
- Зачем нужны?
- Статические и окончательные модификаторы
- Общий синтаксис
- Пример 1
- Пример 2
Java Constants — using Class, Interface, Static Imports
Constants are the constant things in a project. I mean, it is safe to assume that any project would have some kind of constant values used across the code.
The common practice in Java is to declare them as public, static and final variables so that they can be easily referenced wherever they needed.
Here’s a list of patterns that I have seen on using such constants.
1. Define a Constants class
In this approach, you define a class ‘Constants’ and put all your constants inside this class. Then reference the constants as ‘Constants.CONST_NAME’ wherever needed. Easy as it looks.
public class Constants public static final String SITE_NAME="veerasundar.com"; > class Hello public void someFun() System.out.print(Constants.SITE_NAME); > >
But the con of this approach is that you need to prepend the class name ‘Constants’ all the time. If you are using constants very frequently, then this will become little ineffective. We can do better.
2. Define a Constants interface and implement it
The second approach is that you define an Interface that contains all your constants and then implement this interface in the class where you want to use the constants. This way, you don’t need to prefix ‘Constants’, instead you can directly access the constant like CONSTANT_NAME.
public interface Constants public static final String SITE_NAME="veerasundar.com"; > class Hello implements Constants public void someFun() System.out.print(SITE_NAME); > >
But this approach is generally considered as a bad practice because it pollutes the class’s implementation hierarchy. You are forced to implement an interface without much semantic meaning. We can still do better than this.
3. Use Java static imports
Static imports are introduced in Java 5. Using static imports you can import static members/properties of a class so that you can directly access them without prefixing it’s parent class’s name. So, we can define a *Constants *class as shown in first approach above and the use static imports to use the constant properties directly.
package com.test; public class Constants public static final String SITE_NAME = "veerasundar.com"; > import static com.test.Constants.*; public class Hello public void someFun() System.out.print(SITE_NAME); > >
So, we get the best of both worlds — we don’t unnecessarily prefix *Constants *everywhere, and we don’t pollute class’s API too. Win!
But this approach too has some bad press against it. If you use static imports very often, then your code become hard to read and understand. Especially when you statically import a lot of methods. So, use it sparingly and wisely.
What do you think as the best of the above three approaches? Do you use any other approaches other than these? Feel free to comment!
Written by Veerasundar
Veerasundar is a Software Engineer, currently working at Salesforce as a Lead Member of Technical Staff. He has over 16 years of industry experience, building consumer facing web applications. He lives in Chennai, India.
Get The Constant Values From A Given Class
Some java classes have some predefined constants. For example java.lang.Math has the values of E and PI stored in fields.
This java example shows how to get the valuse of these fields from a class using reflection.
Source: (ConstantValues.java)
import java.lang.reflect.Field; public class ConstantValues { public static void main(String. args) { try { Class c = Class.forName(args[0]); Field[] fields = c.getFields(); System.out.println("Constants for: " + c.getName()); for (Field f: fields) { f.setAccessible(true); System.out.print(" " + f.getName()); System.out.println(" : " + f.get(null)); } } catch (Exception e) { System.out.println("Exception: " + e.toString()); } } }
Output:
$ java ConstantValues java.lang.Math E : 2.718281828459045 PI : 3.141592653589793 $ java ConstantValues java.lang.Byte MIN_VALUE : -128 MAX_VALUE : 127 TYPE : byte SIZE : 8 $ java ConstantValues java.lang.Float POSITIVE_INFINITY : Infinity NEGATIVE_INFINITY : -Infinity NaN : NaN MAX_VALUE : 3.4028235E38 MIN_NORMAL : 1.17549435E-38 MIN_VALUE : 1.4E-45 MAX_EXPONENT : 127 MIN_EXPONENT : -126 SIZE : 32 TYPE : float
Константы в Java на примерах
«Constant (константа)» – слово в английском языке, относящееся в основном к «ситуации, которая не меняется». Это одна из фундаментальных концепций программирования в Java, и у нее нет каких-либо специальных предпосылок или концепций, которые необходимо знать перед изучением, кроме базовых навыков программирования.
Константы в Java используются, когда необходимо реализовать «статическое» или постоянное значение для переменной. Язык программирования напрямую не поддерживает константы. Чтобы сделать любую переменную ею, мы должны использовать модификаторы static и final.
Синтаксис
static final datatype identifier_name = constant;
- Модификатор static делает переменную доступной без загрузки экземпляра ее определяющего класса.
- Последний модификатор делает переменную неизменной.
Причина, по которой мы должны использовать как статические, так и конечные модификаторы, заключается в том, что:
- Когда мы объявим переменную «var» только как статическую, все объекты одного класса смогут получить доступ к этому ‘var’ и изменить его значения.
- Когда мы объявляем переменную только как final, для каждого отдельного объекта будет создано несколько экземпляров одного и того же значения константы, и это неэффективно / нежелательно.
- Когда мы используем как static, так и final, тогда «var» остается статичным и может быть инициализирован только один раз, что делает его надлежащей константой, которая имеет общую ячейку памяти для всех объектов своего содержащего класса.
Пример
static final int MIN_AGE = 18;
Допустим, нам нужно определить, кто имеет право на получение постоянных водительских прав в группе людей. Мы уже знаем, что минимальный возраст для получения постоянных водительских прав составляет 18 лет.
Поэтому вместо того, чтобы просить пользователя ввести минимальный возраст для сравнения, мы объявляем идентификатор MIN_AGE как постоянное целое число со значением 18.
import java.util.*; public class DrivingLicense < public static void main(String [] args)< Scanner sc = new Scanner(System.in); static final int MIN_AGE = 18; //Minimum age requirement int[] list = new int[5]; System.out.println("Enter the age of people:"); for(int i=0;i<5;i++)< list[i] = sc.nextInt(); >System.out.println("Result for eligibility:"); for(int i=0;i<5;i++) < if(list[i] >= MIN_AGE) System.out.println(i + " is Eligible"); else System.out.println(i + " is Not Eligible"); > > >
Зачем нужны?
Константы делают вашу программу более легкой для чтения и понимания, когда ее читают другие. Использование их также повышает производительность, поскольку константы кэшируются как JVM, так и вашим приложением.
Статические и окончательные модификаторы
- Статический модификатор в основном используется для управления памятью.
- Это также позволяет переменной быть доступной без загрузки какого-либо экземпляра класса, в котором она определена.
- Последний модификатор означает, что значение переменной не может измениться. Как только значение назначено переменной, другое значение не может быть переназначено той же переменной.
С помощью модификатора final типы данных Primitive, такие как int, float, char, byte, long, short, double, Boolean, можно сделать неизменяемыми / неизменяемыми. Вместе, как мы поняли ранее, эти модификаторы создают постоянную переменную.
Общий синтаксис
public static final int MAX_VALUE = 1000;
Это соглашение использовать заглавную букву имени переменной, которую мы хотим объявить как константу. Если мы сохраним спецификатор доступа для постоянной переменной как частный, то его значения не могут быть изменены в этом классе.
Если мы оставим спецификатор доступа общедоступным для постоянной переменной, то его значения можно изменить в любом месте программы.
Пример 1
В этом примере мы использовали перечисление как enum Apple . Идентификаторы Jonathan, GoldenDel, RedDel, Winesap и Cortland называются константами перечисления.
Каждый из них неявно объявлен как публичный статический финальный член Apple. Переменная перечисления может быть создана как другая примитивная переменная. Он не использует «новый» для создания объекта.
‘ap’ имеет тип Apple, единственные значения, которые могут быть назначены (или могут содержать), являются значениями, определенными перечислением.
Все перечисления имеют два предопределенных метода: values() и valueOf(). Синтаксис этих встроенных методов:
public static enum-type [] .values() public static enum-type.valueOf (String str)
Метод values() дает массив, который состоит из списка констант перечисления. Метод valueOf() дает константу перечисления, значение которой соответствует строке, переданной в str.
Пример 2
enum Season < WINTER, SPRING, SUMMER, FALL; >class EnumExample < public static void main(String[] args) < for (Season s : Season.values()) System.out.println(s);//will display all the enum constants of Season Season s = Season.valueOf("WINTER"); System.out.println("S contains " + s);//output: S contains WINTER >>
В приведенном выше примере мы использовали два встроенных метода перечисления.