多个关键字用法实例是一种很好的编程方法

时间:2017-07-30 08:19:59

标签: java

我正在以下面的方式尝试一段代码,它仅使用单个方法validateParams()对特定类的变量进行验证,并在需要时在程序的不同部分调用它。我们可以说doSomething()方法是Web应用程序的起始方法。

这些类CarComputerMobile之间没有依赖关系。我只想使用单个方法而不是每个类的多个方法进行验证

public void doSomething() {
    validateParams(car);
    statement1...... 
    statement2.....

    validateParams(computer);
    statement3.....

    validateParams(mobile);
}

private void validateParams(Object obj) {
    if(obj instanceof Car){ 
       //Validate variables related to obj  
    } 
    else if(obj instanceof Computer){ 
       //Validate variables related to obj  
    } 
    else if(obj instanceof Mobile){
      //Validate variables related to obj  
    }

    // There are many if loops
}

我在想我正在做一些使用instanceof并以这种方式验证的错误活动。开关盒看起来非常好但它不会允许物体。无论如何,我可以使用lambda表达式处理这个编程。我是Java 8的新手,我发现使用lambda表达式很棘手。

3 个答案:

答案 0 :(得分:3)

啊,我记得昨天的类似问题。 Ç - :=

所以,正如我昨天所说,声明一个接受Object类型参数的函数几乎总是一个坏习惯。接受Object参数的函数仅在框架级或系统级编程中找到。在进行框架级或系统级编程时,您不了解应用程序级实体的概念,因此您不了解任何CarComputerMobile,所以不可能像这样使用instanceof

通常,instanceof的任何使用都表明某些事情是错误的。对此的行业术语是"代码气味"。

极少数且非常特殊的情况下,传递Object参数并使用instanceof是必要和适当的,例如在编码boolean equals( Object other )方法时。每当您在这些极少数众所周知的案例之外看到Object个参数和instanceof时,就会产生代码味道。不要这样做。

我会坚持认为,为了让你的代码闻不到,你需要提出一个共同的基类。昨天的例子涉及CarMotorcycleBicycle,我建议提出一个Vehicle基类。现在,您已选择类CarComputerMobile,以表明它们不共享任何常用功能。我建议:

  1. 要么这些类真的没有共享功能,在这种情况下将它们作为Object传递并使用instanceof是不好的做法,当然要被视为代码气味而不是通过任何代码审查在业内,或

  2. 还有一些方法可以提取一个可以声明validate()方法的公共基类(或接口),以避免传递Object个参数并使用instanceof。它可以是GadgetMyWorldEntityValidatable

答案 1 :(得分:2)

您有多种选择。一种方法是让对象使用需要validate()方法的接口自行进行验证,如@dunni的评论中所指出的那样。

如果您确实需要在不改变任何实现的情况下在各个类之外执行验证,则可以使用方法重载。创建多个名为

的函数
private void validateParams(Type obj)

使用相应类型的对象来验证并在那里实现该类型的特定验证。所以你有这样的方法:

private void validateParams(Computer computer) {...}
private void validateParams(Car car) {...}
private void validateParams(Mobile mobile) {...}

你可以使用以下方式调用所有这些:

validateParams(obj) // where obj is of type Computer, Car or Mobile

答案 2 :(得分:1)

绝对没有理由在同一方法中处理三个完全不同的对象。您应该定义一个接口(例如Validateable)并在其中放置一个validate方法:

interface Validateable {
    public void validate();
}

然后让类实现它

class Car implements Validateable { ... }