Arefe
Arefe

Reputation: 12397

How do I store a variable inside an interface to use?

I have an interface namely Medicine and I created few instances for that. let's have a look,

interface Medicine {

    Medicine Antibiotic = new Medicine() {

        @Override
        public int getCountOfTuberculous(QuarantineTwo quarantineTwo) {
            return quarantineTwo.tuberculous().getSize();
        }

        /**
         * Antibiotic cures the tuberculous
         *
         * @param q
         */
        @Override
        public void on(QuarantineTwo q) {

            int initialNumOfTuberculous = getCountOfTuberculous(q);
            System.out.println("Numbe of perople have Tuberculous before treated w/ Antibiotic  = " + initialNumOfTuberculous);

            q.tuberculous().changeHealthStatus(q.healthy());
        }

        @Override
        public Treatment combine(Treatment treatment) {
            return treatment.plus(this);
        }

        @Override
        public String toString() {
            return "Antibiotic";
        }
    };

    Medicine Insulin = new Medicine() {

        // cant use this method as it will provide the number of Tuberculous 0
        // because, initially, the Quarantine was treated with Antibiotic 
        @Override
        public int getCountOfTuberculous(QuarantineTwo quarantineTwo) {
            return quarantineTwo.tuberculous().getSize();
        }

        @Override
        public void on(QuarantineTwo q) {

            if (isInsulinCombinedWithAntibiotic(q.getTreatment())) {
                q.healthy().changeHealthStatus(q.feverish());
//                q.healthy().changeHealthStatus(q.feverish(), iniNumOfTuberculous);
            } else {
                // Prevent None effects, done is this.combine
            }
        }

        @Override
        public Treatment combine(Treatment treatment) {
            return treatment.remove(Medicine.None)
                    .plus(this);
        }

        /**
         * helper method to see whether the Insulin is combined with Antibiotic
         *
         * @param treatment
         * @return
         */
        private boolean isInsulinCombinedWithAntibiotic(Treatment treatment) {
            return treatment.contains(this) &&
                    treatment.contains(Medicine.Antibiotic);
        }

        @Override
        public String toString() {
            return "Insulin";
        }
    };

    void on(QuarantineTwo quarantineTwo);
    Treatment combine(Treatment treatment); 
    int getCountOfTuberculous(QuarantineTwo quarantineTwo);
}

Now, when I'm testing I may call like this,

    @Test
    public void antibioticPlusInsulin() throws Exception {
        quarantine.antibiotic();
        quarantine.insulin();
        assertEquals("F:3 H:1 D:3 T:0 X:0", quarantine.report());
    }

The two lines of codes means that we combined the treatment procedures with both the antibiotic and insulin to the Quarantine system and affect should be accumulative.

        quarantine.antibiotic();
        quarantine.insulin();

And, hence, I would like to keep a track of how many people are cured with Antibiotic initially from the Tuberculous stored in the initialNumOfTuberculous and use that value to make the call

q.healthy().changeHealthStatus(q.feverish(), iniNumOfTuberculous); This call suppose to change the all the people from healthy state to feverish but the ones initially cured with Tuberculous.

How to store the value of the iniNumOfTuberculous inside the Medicine Antibiotic and make it available in the Medicine Insulin ?

Upvotes: 0

Views: 1768

Answers (1)

OneCricketeer
OneCricketeer

Reputation: 191711

Sounds like you need an abstract class

abstract class AbstractMedicine implements Medicine {
    protected int iniNumOfTuberculous;
}

public class Insulin extends AbstractMedicine {
    // can use iniNumOfTuberculous here
}

Note: The availability of the variable definition is shared; the value itself is not.

I don't think you should implement your concrete classes inside an interface, by the way

Upvotes: 1

Related Questions