Search code examples
javaabstractioncontract

Write abstraction function and representation invariant


I know what abstraction function and representation invariant are, but I have difficulty writing them on my own. Abstraction Function: A function from an object's concrete representation to the abstract value it represents. Representation Invariant: A condition that must be true over all valid concrete representations of a class. For example:

class Appointment{
    /**
     * AF: 
     * IR: 
     */
    private Time time;
    private Intervention intervention;
    private Room room;


    /** EFFECT initializes to null an appointment
     *  @param time REQUIRE != null
     *  @param intervention  REQUIRE != null
     *  @param room REQUIRE != null
     */
    public Appointment(Time time, Intervention intervention, Room room){
        time = null;
        intervention = null;
        room = null;
    }}

my question is: how could they be written?

Thank you.


Solution

  • This way you force the implementator of classes that extends abstract A to define its own invariant.

    abstract class A {
       public void doSth(){
           Invariant invariant = getInvariant();
           check(invariant);
           //do some work
           check(invariant);
       }
    
       //define your invariant in concrete impl
       protected abstract Invariant getInvariant();
    }
    

    I re-re-read your question again but i am still not sure. Or do you want to define invariant in the abstract class and check it in conrete implementations?

    abstract class A {
       private void checkInvariant(){
           //check state
           //if state is breaking invariant throw exception
       }
    
       public void doSth() {
            checkInvariant();
            doActualWork();
            checkInvariant();
       }
    
       protected abstract void doActualWork();
    }