ABMISpreadsheetComputationClass.java |
package lectures.ui; import util.annotations.WebDocuments; import util.annotations.EditablePropertyNames; import util.annotations.PropertyNames; import util.annotations.StructurePattern; import util.annotations.StructurePatternNames; /** * This class demonstrates annotations and manipulation by object editor. * Process the annotation instructions only when asked to do so in the * main class. * */ /* * Annotations * * (T/F) An annotation is: * (a) a comment for describing a program construct that is filtered out by the * compiler from the source code. * (b) an instantiation of a special class for describing some program construct. * * * An annotation is an instantiation of an annotation class that describes some * program construct such as a class, method or variable that follows it. * * As we see above, an annotation class is imported like a regular class. * * It is not instantiated using new. * * Instead, the @ symbol precedes its constructor call, which can * take arguments. * * We see three annotation classes instantiated below, * which describe the class declared below the instantiations. * * (T/F) ObjectEditor checks that each property listed in the @PropertyNames * annotation of a class is actually a property of the class. * * (T/F) The Java compiler checks that each property listed in the * @EditablePropertyNames annotation of a class is actually an editable property of * the class. * * Uncomment the commented property name in @PropertyNames. Do you get a warning or * error from the compiler? * * If not, run the main program. Do you get a warning or error from the ObjectEditor * in the console? * * Uncomment the commented property name in @EditablePropertyNames. Do you get a * warning or error from the compiler? * * If not, run the program. Do you get a warning or error from the ObjectEditor * in the console? * * (T/F) Removing the name of an editable property from the @EditablePropertyNames * annotation makes it uneditable by the user and results in a warning from * ObjectEditor. * * (T/F) Removing the name of the name of a property from both * @EditablePropertyNames and @PropertyNames annotation makes it * unviewable and results in a warning from ObjectEditor. * * Comment out the height property from the editable property names annotation. * * Run the program. Do you see a warning from OE? Can you edit the property? * * Now comment out this property also from the property names annotation. * * Run the program. Do you see a warning from OE? Can you view the property? * * (T/F) Annotations can help specify and document the (editable) properties * of a class. * (T/F) It is possible to build a tool that checks that a class implements * specified properties. * * (T/F) Removing @StructurePattern(StructurePatternNames.BEAN_PATTERN) * annotation from a class results in a warning from ObjectEditor if the * class defines one or more properties. * * Now comment out the @StructurePattern annotation in AUIBMISpreadsheet and run * the program * * */ @StructurePattern(StructurePatternNames.BEAN_PATTERN) @PropertyNames({ "Weight", "Height", // "WeightGainRate", "BMI" }) @EditablePropertyNames({ "Height", "Weight", // "BMI" }) @WebDocuments({"Lectures/Ui.pptx", "Lectures/Ui.pdf", "Videos/Ui.avi"}) public class ABMISpreadsheetComputationClass implements UIBMISpreadsheet { static final double SAMPLE_HEIGHT = 1.77; static final double SAMPLE_WEIGHT = 75; double height; double weight; public ABMISpreadsheetComputationClass() { } public ABMISpreadsheetComputationClass( double anInitialHeight, double anInitialWeight) { setHeight(anInitialHeight); setWeight(anInitialWeight); } public double getWeight() { // System.out.println ("getWeight called:"); return weight; } public void setWeight(double newValue) { System.out.println ("SetWeight called:" + newValue); weight = newValue; } public double getHeight() { System.out.println ("getHeight called:"); return height; } public void setHeight(double newValue) { System.out.println ("setHeight called:" + newValue); height = newValue; } public double getBMI() { System.out.println ("getBMI called:"); return weight/(height *height); } public void incrementWeight(double anIncrement) { System.out.println ("incrementWeight called:" + anIncrement); setWeight(getWeight() +anIncrement ); } public void incrementHeight(double anIncrement) { System.out.println ("incrementHeight called:" + anIncrement); setWeight(getHeight() +anIncrement ); } }