我正在以下面的方式尝试一段代码,它仅使用单个方法validateParams()
对特定类的变量进行验证,并在需要时在程序的不同部分调用它。我们可以说doSomething()
方法是Web应用程序的起始方法。
这些类Car
,Computer
和Mobile
之间没有依赖关系。我只想使用单个方法而不是每个类的多个方法进行验证
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表达式很棘手。
答案 0 :(得分:3)
所以,正如我昨天所说,声明一个接受Object
类型参数的函数几乎总是一个坏习惯。接受Object
参数的函数仅在框架级或系统级编程中找到。在进行框架级或系统级编程时,您不了解应用程序级实体的概念,因此您不了解任何Car
,Computer
或Mobile
,所以不可能像这样使用instanceof
。
通常,instanceof
的任何使用都表明某些事情是错误的。对此的行业术语是"代码气味"。
极少数且非常特殊的情况下,传递Object
参数并使用instanceof
是必要和适当的,例如在编码boolean equals( Object other )
方法时。每当您在这些极少数众所周知的案例之外看到Object
个参数和instanceof
时,就会产生代码味道。不要这样做。
我会坚持认为,为了让你的代码闻不到,你需要提出一个共同的基类。昨天的例子涉及Car
,Motorcycle
和Bicycle
,我建议提出一个Vehicle
基类。现在,您已选择类Car
,Computer
和Mobile
,以表明它们不共享任何常用功能。我建议:
要么这些类真的没有共享功能,在这种情况下将它们作为Object
传递并使用instanceof
是不好的做法,当然要被视为代码气味而不是通过任何代码审查在业内,或
还有一些方法可以提取一个可以声明validate()
方法的公共基类(或接口),以避免传递Object
个参数并使用instanceof
。它可以是Gadget
,MyWorldEntity
或Validatable
。
答案 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 { ... }