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?
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;
        }
    };
}
MathOperator without changing MathOperators
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);
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With