使用IF还是多态性?

Vin*_*ves 2 java oop polymorphism design-patterns if-statement

我有一个关于 Java 的问题。我使用 Java 还不到一年,我开始对设计模式产生有趣的疑问:

\n

例如,我想用面向对象(OO)原则改进我的代码,使其更清晰,但它提出了一个问题:我不会增加处理时间吗?

\n

在下面的代码中:

\n
import java.util.ArrayList;\nimport java.util.List;\n\n\npublic class EscritorioContabilidade {\n    \n    //metodo para recuperar a informacao salarial utilizando os IF\xc2\xb4s da pior maneira....rsrsr\n    public double getSalarioFuncionario(String tipoFuncionario){\n        double salario = -1;\n        if("gerente".equals(tipoFuncionario)){\n            salario = 1000;\n        }\n        else if("balconista".equals(tipoFuncionario)){\n            salario = 900;\n        }\n        else if("faixineiro".equals(tipoFuncionario)){\n            salario = 550;\n        }\n        return salario;\n    }\n    \n    //metodo para recuperar a informacao salarial utilizando os IF\xc2\xb4s. Nao melhoramos muito\n    public double getSalarioFuncionario(Object funcionario){\n        double salario = -1;\n        if(funcionario instanceof Gerente){\n            salario = 1000;\n        }\n        else if(funcionario instanceof Balconista){\n            salario = 900;\n        }\n        else if(funcionario instanceof Faixineiro){\n            salario = 550;\n        }\n        return salario;\n    }\n    \n    //metodo para recuperar a informacao salarial utilizando polimorfismo. Agora sim!\n    public double getSalarioFuncionario(Funcionario funcionario){\n        return funcionario.informarSalario();\n    }\n    \n    public static void main(String [] asdf){\n        EscritorioContabilidade escritorioContabilidade = new EscritorioContabilidade();\n        double folhaPagamento = 0;\n        \n        List<Funcionario> listaFuncionario = new ArrayList<Funcionario>();\n        \n        //adicionando os funcionarios \n        listaFuncionar\n
Run Code Online (Sandbox Code Playgroud)\n
io.add(new Gerente());\n        listaFuncionario.add(new Balconista());\n        listaFuncionario.add(new Faixineiro());\n        \n        //usando o polimorfismo para determinar a folha de pagamento\n        for (Funcionario funcionario : listaFuncionario) {\n            folhaPagamento += escritorioContabilidade.getSalarioFuncionario(funcionario);\n        }\n        System.out.println("folha de pagamento: "+folhaPagamento);\n        \n        //agora vamos usar um dos metodos que utilizam os IFs e voces podem ver a clareza em ambos os trechos de codigo\n        folhaPagamento = 0;\n        folhaPagamento +=  escritorioContabilidade.getSalarioFuncionario("gerente");\n        folhaPagamento +=  escritorioContabilidade.getSalarioFuncionario("balconista");\n        folhaPagamento +=  escritorioContabilidade.getSalarioFuncionario("faixineiro");\n        \n        System.out.println("folha de pagamento: "+folhaPagamento);\n    }\n}\n\n\npublic abstract class Funcionario {\n    public abstract double informarSalario();\n}\n\n\npublic class Gerente extends Funcionario {\n\n    @Override\n    public double informarSalario() {\n        return 1000;\n    }\n\n}\n\nclass Balconista extends Funcionario{\n\n    @Override\n    public double informarSalario() {\n        return 900;\n    }\n    \n}\n\nclass Faixineiro extends Funcionario{\n\n    @Override\n    public double informarSalario() {\n        return 550;\n    }\n    \n}\n
Run Code Online (Sandbox Code Playgroud)\n

在这段代码中,如果我使用多态性,我的代码肯定会变得更加优雅。但是,如果我使用 if 语句,它不会有更好的性能吗,因为它不会创建内存指针等?

\n

我希望澄清一个关于Java和设计模式的问题。

\n

Boh*_*ian 9

“内存和性能”差异可以忽略不计,接近于零。

拥有多个具有恒定行为的类总是比拥有一个具有可变行为的“瑞士军刀”类要好。

您的“类型化”解决方案更易于阅读、理解、测试和扩展——这是需要考虑的最重要的方面。