Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - implementation instances inside an interface

Tags:

java

In my project I need to create objects for each kind of Java Math Operator like "Add", "Substraction", "Multiplication", etc. And these operators should be singletons.

So here is what I am going to do. I define the Math Operator as an interface and I put those implementations inside it as I don't want to define singleton classes for each operator.

public interface MathOperator {


double operate(double a, double b);

MathOperator ADD = new MathOperator(){

    @Override
    public double operate(double a, double b) {
        return a + b;
    }

};

MathOperator SUBSTRACT = new MathOperator(){

    @Override
    public double operate(double a, double b) {
        return a - b;
    }

};  

}

I don't see much of such usage when I Google this. So I wonder if this is a good practice and if there are better and more graceful approaches?

like image 488
Jay Avatar asked Feb 07 '12 08:02

Jay


2 Answers

I would do smt like

1) Define interface

interface MathOperator {
    double operate(double a, double b);
}

2) Than have some common implementation in enum (less code)

enum MathOperators implements MathOperator {
    ADD {
        @Override
        public double operate(double a, double b) {
            return a + b;
        }
    },

    SUBTRACT {
        @Override
        public double operate(double a, double b) {
            return a - b;
        }
    }
}

3) Or public static members (more clean solution).

class MathOperators {
    public static MathOperator ADD = new MathOperator() {
        @Override
        public double operate(double a, double b) {
            return a + b;
        }
    };
    public static MathOperator SUBTRACT = new MathOperator() {
        @Override
        public double operate(double a, double b) {
            return a - b;
        }
    };
}
  • can create new MathOperator without changing MathOperators
  • have nice API for common operations
  • shouldn't write singletons
  • have nice clean interface
like image 104
Stan Kurilin Avatar answered Sep 20 '22 05:09

Stan Kurilin


One idiom that I've seen used in precisely these circumstances is the use of enum:

public enum MathOperator {

    ADD {
        @Override
        public double operate(double a, double b) {
            return a + b;
        }
    },

    SUBTRACT {
        @Override
        public double operate(double a, double b) {
            return a - b;
        }
    };

    public abstract double operate(double a, double b);

}
like image 30
NPE Avatar answered Sep 21 '22 05:09

NPE