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 in a program can lead to two problems: first, the meaning of the literal is often obscured or unclear from the context (magic numbers); second, changing a frequently - used literal requires searching the entire program source for that literal , and distinguishing those that must be modified from those that should remain unmodified.
...
Constants should be declared as static
and final
, for . For example:
Code Block |
---|
private static final int SIZE = 25; |
...
The methods use the seemingly - random literals 12.56
, 4.19
, and 6.28
to represent various scaling factors used to calculate these dimensions. A developer or maintainer reading this code would have little idea about how they were generated or what they mean and , consequently , would be unable to understand the function of this code.
...
This noncompliant code example attempts to avoid the above issues problem by explicitly calculating the required constants.
...
The code uses the literal 3.14
to represent the value ?
. 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 ?
is desired, all occurrences of 3.14
in the code would have to be found and replaced.
...
In this compliant solution, a constant PI
is declared and initialized to 3.14
. Thereafter, it is referenced in the code whenever the value of ?
is needed.
Code Block | ||
---|---|---|
| ||
private static final double 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; } |
This technique reduces clutter and promotes maintainability. If a more precise approximation of the value of ?
is required, the programmer can simply redefine the constant.
...
The programmer has assumed that BUFSIZE
is 512, and right-shifting 9 bits is the same (for positive numbers) as dividing by 512. However, if BUFSIZE
changes to 1024 in the future, modifications will be difficult and error - prone.
Compliant Solution
This compliant solution uses the identifier assigned to the constant value in the expression.
...
DCL02-EX1: The use of symbolic constants should be restricted to cases where in which they improve the readability and maintainability of the code. When the intent of the literal is obvious, or where the literal is not likely to change, using symbolic constants can impair code readability. The following noncompliant code example obscures the meaning of the code by using too many symbolic constants.
Code Block | ||
---|---|---|
| ||
private static final double AREA_FACTOR = 4.0 * Math.PI; private static final double VOLUME_FACTOR = 4.0 / 3.0 * Math.PI; private static final double CIRCUMFERENCE_FACTOR = 2.0 * Math.PI; double area(double radius) { return AREA_FACTOR * radius * radius; } double volume(double radius) { return VOLUME_FACTOR * radius * radius * radius; } double greatCircleCircumference(double radius) { return CIRCUMFERENCE_FACTOR * radius; } |
The values 4.0
and 3.0
in the volume calculation are clearly scaling factors used to calculate the sphere's volume and are not subject to change (unlike the approximate value for ?
), so they can be represented exactly. There is no reason to change them to increase precision because replacing them with symbolic constants actually impairs the readability of the code.
...
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="63aac3d8dc040ac6-240e38a7-4bda4205-9e4d8522-e92dcd8708cf70569178e2c6"><ac:plain-text-body><![CDATA[ | [[API 2006 | AA. References#API 06]] | ]]></ac:plain-text-body></ac:structured-macro> |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="ec8c7510f22aa20d-e9dfcaa5-490545cd-b4cbb224-33389391f9f98d6043a9bf36"><ac:plain-text-body><![CDATA[ | [[Core Java 2004 | AA. References#Core Java 04]] | ]]></ac:plain-text-body></ac:structured-macro> |
...