我的目标是将Either课程与我的Human,Weapon和Magazine课程一起使用。
这些是我想要测试的不同人类声明。 (没有武器,没有武器,并且全部都有)
Human noWeapon = new Human(null);
Human noMag = new Human(new Weapon(null));
Human hasAll = new Human(new Weapon(new Magazine(2)));
目前,我正在以下列方式创建一个Either:
Human noWeapon = new Human(null);
Either <String, Human> either2 = new Right <String, Human>(noWeapon);
Right <String, Human> either2_right = (Right<String, Human>) either2;
我正在努力理解Either类的内部工作方式以及我可以用它来处理错误的方法。我希望能够在发生错误时捕获这些错误,以便我知道错误发生的时间
either2_right.getRight().getWeapon().getMag().getCount();
目前,由于显而易见的原因,这会抛出NullPointerException错误 - 但我的目标是捕获错误并知道错误发生的时间。
My Either课程如下:
abstract class Either<A, B> { }
class Left<A, B> extends Either<A, B> {
public A left_value;
public Left(A a)
{
left_value = a;
}
public A getLeft(){
return this.left_value;
}
public <B2> Either<A,B2> flatMap(final Function<B,Either<A,B2>> f){
return (Either<A,B2>)this;
}
public <B2> Either<A,B2> map(final Function<B,B2> f){
return (Either<A,B2>)this;
}
}
class Right<A, B> extends Either<A, B> {
public B right_value;
public Right(B b)
{
right_value = b;
}
public B getRight(){
return this.right_value;
}
public <B2> Either<A,B2> flatMap(final Function<B,Either<A,B2>> f){
return f.apply(right_value);
}
public <B2> Either<A,B2> map(final Function<B,B2> f){
return new Right(f.apply(right_value));
}
}
我在以下3个课程中使用Either: 人
class Human {
Weapon w;
public Human(Weapon w)
{
this.w = w;
}
public Weapon getWeapon()
{
return w;
}
}
武器:
class Weapon {
Magazine m;
public Weapon(Magazine m)
{
this.m = m;
}
public Magazine getMag()
{
return m;
}
}
杂志:
class Magazine {
private int count;
public Magazine(int c)
{
count = c;
}
public int getCount()
{
return count;
}
}
感谢您提供的任何帮助!
答案 0 :(得分:0)
我正在努力理解Either类的内部工作方式以及我可以用它来处理错误的方法。
让我们从问题的第二部分开始,如何使用Either
进行错误处理?
Either
可以包含两个值中的一个,对于错误处理,您可以声明一个方法来返回将保存有效计算结果或异常的Either
。例如:
public Either<ArithmeticException, Double> divide (Double x, Double y) {
try {
return new Right<ArithmeticException, Double>(x/y);
} catch (ArithmeticException e) {
return new Left<ArithmeticException, Double>(e);
}
}
如果调用者尝试除以零,则不会得到ArithmeticException,他将收到一个Either
持有异常,在此示例中,他将获得Left
。惯例是在Right
中保留有效的返回结果,而另一个结果为Left
。
您提供的实施方式不会让调用者轻松检查他是否有Right
或Left
,或者无论是{{1}都可以轻松处理结果或Right
更完整的Left
here实现提供了便利(例如Either
获取getOrThrow
值或抛出异常Right
不是Either
)。