Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Java supports the use of various types of literals, such as integers (5, 2), floating point numbers (2.5, 6.022e+23), characters ('a', '\n'), booleans ('true', 'false'), and strings ("Hello\n"). Extensive use of literals within a program can lead to two problems: first, the meaning of the literal is often obscured or unclear from the context ("magic numbers"), and second, changing a frequently-used literal requires the entire program source code to be searched for occurrences of that literal, creating possible error sources if some of the occurrences are overlooked.

A solution to these problems is to declare meaningfully-named constants as class variables. Their values can be set to the desired literals, and these constants may be referenced throughout the program rather than inserting the literals themselves. The advantages to of this approach are that the constant's name can clearly indicate its meaning or intended use, and should the constant need to be changed, its declaration can be modified without having to search the entire code for all its occurrences.

...

Code Block
private static final int SIZE=25;

This code snippet declares the value SIZE to be of the type int and to store the immutable value 25assigns 25 to it. This constant can subsequently be used wherever the value 25 is needed.

Although final is more most often safe for creating compile time immutable constants, its use has a few caveats when dealing with mutable data. See OBJ03-J. Be careful about final reference for more details.

...

The code uses the literal " 3.14 " to represent the value pi. Although this removes some of the ambiguity from the literals, it complicates code maintenance. If the programmer were to decide that a more precise value of pi is desired, he would need to find all occurrences of " 3.14 " in the code and replace them.

...

In this compliant solution, a constant PI is first declared and initialized to 3.14. Thereafter, and it is thereafter referenced in the code wherever whenever the value of pi is needed.

Code Block
bgColor#ccccff
private static final int PI = 3.14;

double area(double radius) {
return 4.0*PI*radius*radius; }

double volume(double radius) {
return 4.0/3.0*PI*radius*radius*radius; }

double greatCircleCircumference(double radius) {
return 2*PI*radius; }

...

EX1: The use of symbolic constants should be restricted to cases where they improve the readability and maintainability of the code. Using them when the intent of the literal is obvious, or where the literal is not likely to change, can impair code readability. In the Compliant Solution abovepreceding compliant solution, the values 4.0 and 3.0 in the volume calculation are clearly scaling factors used to calculate the circle volume, and as such are not subject to change (unlike pi, they can be represented exactly; there is no reason to change them to increase precision). Hence, replacing them with symbolic constants would be inappropriate.

...

Using numeric literals makes code more difficult to read, understand or and edit.

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

DCL03-J

low

unlikely

high

P1

L3

...