[英]Preferred way to handle Java exceptions in ServletContextListener
[英]What is the preferred way to handle this in java
假设我有以下课程:
public interface X {
...
}
public class A implements X {
...
}
public class B implements X {
...
}
现在让我说我有一个方法,它采用X类型的对象,并且必须以不同方式处理X的每个实现。 天真的做法是:
public void doSomething(X x) {
if(x instanceof A)
doSomethingA((A) x);
else if(x instanceof B)
doSomethingB((B) x);
}
......但这看起来特别难看,而且不是多态的。 一般来说处理这种情况的干净方法是什么?
编辑:当然,如果我可以将doSomething()的实现推送到A类和B类,那将会很容易,但在那些没有意义的情况下呢? 即doSomething()是在C类上定义的,并且实现高度依赖于C的内部状态。
这很容易:
public interface X {
int doSomething();
}
public class A implements X {
public int doSomething() {
// implementation in A
}
}
public class B implements X {
public int doSomething() {
// implementation in B
}
}
更新:好的,似乎在这里我们在C中有一些算法,它依赖于C的状态以及A / B的差异。 然后我会尝试拆分该算法,以便C类只有A和B的通用实现,并且A / B相关的部分应该作为在C中调用的相同方法的特定实现转到适当的类。如果可能的话,C的状态可以部分传递给A和B的doSomething
你应该推动实施doSomethingA
类A
和doSomethingB
到classB
,定义doSomething
在界面X
,只是调用x.doSomething()
在东西线双重分发 )。
考虑到关于处理对X
类型A
或B
的依赖性的问题的最新编辑,当然不应该使用instanceof
运算符,因为它在底层实现类上建立了硬依赖性,并且当X x
时代码会失败。传递给C.doSomething()
X x
是一个装饰实例。
AFAIK, C.doSomething()
的实现将归结为你必须使用来自A
或B
的信息,并且在该点运行的步骤应被抽象为A
和B
方法,在接口X
声明。 这将确保X
任何新实现也实现C
依赖的此方法,从而使代码更易于维护。 HTH。
正确的方法是访问者模式
首先,我会实现一个接口而不是扩展:)我的第一个应该是这样的
class Parent {
public Parent() {
}
}
class Child extends Parent {
public Child() {
super();
}
}
public class MainClass {
public static void main(String[] a) {
Child child = new Child();
if (child instanceof Parent) {
System.out.println("true");
}
}
}
public interface X {
doSomeThing();
}
public class A implement X {
doSomeThing(){}
}
public class B implement X {
doSomeThing() {}
}
现在你可以使用了
X a = new A();
a.doSomeThing();
你可以将某些东西()移到界面X中吗? 然后只需调用x.do something()而无需强制转换或使用实例。
这更像是一个设计问题。 如果doSomething()的A和B实现严重依赖于C对象状态,则可以将其作为参数传递:x.doSomething(C c)
在界面X中创建doSomething():
public interface X {
doSomething(C c);
}
public class A extends X {
doSomething(C c) {
...
}
}
public class B extends X {
doSomething(C c) {
...
}
}
然后,您的初始方法变为:
public void doSomething(X x) {
x.doSomething(C c);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.