// file: IMyConsts.java
/* ************************************************************
*
* Copyright (c) 1997 :
* Ir. Marc W.F. Meurrens (A.Ir.Br.), Brussels,
* Computer Graphics & Scientific Applications, scrl, Brussels
*
marc.meurrens@acm.org
*
http://homepages.ulb.ac.be/~meurrens
*
* This code was created and is used for academic and scientific purposes.
* See
http://www.ulb.ac.be/esp/ip-Links/Java/joodcs
* or
http://www.ulb.ac.be/esp/ip-Links/Java/joodcs/Meurrens.html
* (this last page may be temporarily closed).
* You may not use this code in commercial applications without prior author's agreement.
* You may copy and use this code for personal or non-commercial purposes
* but you may not remove this comment.
*
* Revisions:
*
* 10-10-97 class EnumColor:
* shows that the EnumCol data members are normally not needed.
* 10-09-97 "abstract + final class" problem:
* the comment "(now?)" is added after our discussion with Guy Steele.
* 09-20-97 MM: revisited for web publication
*
* *************************************************************
*
* This file demonstrates the use of static constants in interfaces.
* Contrary to a common misunderstanding, constants of a non primitive type
* are possible.
* This file demonstrates compile time & run time constants
* and shows when the run time constants are effectively initialized.
*
* Additionaly, this file demonstrates the need of 3 Java missing features
* and how to bypass these missing features:
*
* - the lack of C++ enum like values
* - the impossibility to declare a class simultaneously abstract and final
* - the lack of a static initializer block in interfaces
*
******************************************************************* */
import java.lang.Math ;
import java.lang.Double ;
import java.util.Vector ;
public interface IMyConsts
{
// 1. compile time constants
public static final int AGE = 7 ;
public static final double PI2 = 2 * Math.PI ;
public static final String COPYRIGHT = "(c) My Company" ;
// 2. run time constants
public static final String STR_PI = Double.toString( Math.PI ) ;
public static final Vector VVV = new Vector(16, 8) ;
// 3. public const of a nested type
// bypass the missing C++ enum like feature in Java
public static final EnumCol GREEN = new EnumCol() ;
public static final EnumCol RED = new EnumCol() ;
public static final EnumCol ORANGE = new EnumCol() ;
// 4. public array const
public static final int[] SIZES = new int[20] ;
public static final double[][] ARRAY = new double[3][4] ;
public static final double[][] MATRIX = { {1,0,0} , {0,1,0} , {0,0,1} } ;
// 5. bypass missing static initializer in interface
// (static initializer exists in classes, but NOT in interfaces)
public static final Vector VCT = StaticInit.queryVCT() ;
public static final double[] SERIE = StaticInit.querySERIE(AGE) ;
// 6. nested class used to generate C++ enum-like constants
// bypass the missing C++ enum like feature in Java
public static final class EnumCol
{
private static int g = 0 ;
public final int i ;
private EnumCol() { i=g++;
System.out.println("DEMO = ENTER EnumCol " + i) ;
}
} // end nested class EnumCol
// 6.BIS nested class used to generate C++ enum-like constants
public static final class EnumColor { private EnumColor() {} }
// 7. nested class used to bypass the lack of a "static-initializer" feature
public static abstract /* final */ class StaticInit
// unfortunately, a class cannot be simultaneously declared final & abstract
// see note below
{
private StaticInit() {} // see note below
protected static Vector queryVCT()
{
System.out.println("DEMO = ENTER queryVCT") ;
Vector v = new Vector() ;
v.addElement(new String("one")) ;
v.addElement(new Double(2)) ;
return (v) ;
}
protected static double[] querySERIE(int i_1_Nbr)
{
System.out.println("DEMO = ENTER querySERIE " + i_1_Nbr) ;
double[] d_R = new double[i_1_Nbr] ;
int j ;
for(int i=0; i < i_1_Nbr ; i++)
{
j=i+1 ;
d_R[i] = 1 / (j*j) ;
}
return (d_R) ;
}
} // end nested class StaticInit
// 8. nested demo class
public static abstract /* final */ class Sdemo
// unfortunately, a class cannot be simultaneously declared final & abstract
{
private Sdemo() {} // see note below
public static void main (String[] str_1_Args)
{
System.out.println("DEMO = BEGIN") ;
System.out.println("Age = " + IMyConsts.AGE) ;
System.out.println("2 Pi = " + IMyConsts.PI2) ;
System.out.println("Copyright = " + IMyConsts.COPYRIGHT) ;
System.out.println("Pi = " + IMyConsts.STR_PI) ;
System.out.println("Orange = " + IMyConsts.ORANGE.i) ;
System.out.println("Sizes = " + IMyConsts.SIZES.length) ;
DoIt( IMyConsts.GREEN ) ;
System.out.println("Array = " + IMyConsts.ARRAY.length) ;
System.out.println("Matrix = " + IMyConsts.MATRIX[1][1]) ;
System.out.println("Vector = "
+ IMyConsts.VCT.elementAt(0)
+ " " + IMyConsts.VCT.elementAt(1)) ;
System.out.println("Serie = " + IMyConsts.SERIE[5]) ;
System.out.println("DEMO = END") ;
}
static void DoIt(IMyConsts.EnumCol enu_1_Traffic)
// bypass the missing C++ enum like feature in Java
{
if(enu_1_Traffic == IMyConsts.RED)
{
System.out.println("DEMO = STOP") ;
}
else
{
System.out.println("DEMO = DRIVE CAREFULLY") ;
}
}
} // end nested class Sdemo
/*
* NOTE: abstract final class, unique private CT
*
* We avoid instanciation by declaring the class as *abstract*,
* (To declare a class as *abstract*, there is no need for abstract methods).
* To avoid derivation, we would like to also declare the class as *final*.
* Unfortunately, we may not declare a class simultaneously final & abtract.
* We make the unique CT *private* to obtain the expected result.
*
* An alternative to the above solution may be to declare the class as *final*
* and declare the unique CT as *private*.
* However, this construction does not avoid the creation of instances thru
* static methods of the class it self,
* or, for nested classes, from within a member of the enclosing class,
* or when initializing a data member of an enclosing class or interface.
*/
} // end interface IMyConsts
/* OUTPUT
> java IMyConsts$Sdemo
DEMO = BEGIN
Age = 7
2 Pi = 6.283185307179586
Copyright = (c) My Company
DEMO = ENTER EnumCol 0
DEMO = ENTER EnumCol 1
DEMO = ENTER EnumCol 2
DEMO = ENTER queryVCT
DEMO = ENTER querySERIE 7
Pi = 3.141592653589793
Orange = 2
Sizes = 20
DEMO = DRIVE CAREFULLY
Array = 3
Matrix = 1.0
Vector = one 2.0
Serie = 0.0
DEMO = END
*/
// eof: IMyConsts.java