有没有一种简短优雅的方法来编写异常提供的变量?
Is there a short elegant way to write variable providing with exception?
所以,我想为我的代码编写这些东西,但是一个变量的代码太多了。我如何使用现代 Java 来更短或更清晰地解决这个问题?在单独的方法中移动它并不能解决问题,因为我仍然需要检查变量是否为 null,这很冗长并且添加了仅使用一次的额外方法。可以在这里使用 Optionals 吗?似乎 return
阻止了这种情况。也许有办法将这个东西折叠成一个用于许多变量的东西,例如下面描述的 foo
?我不知道,只是为了让它更具可读性和简洁性。
Foo foo;
try {
foo = FooProvider.getFoo(...);
} catch (FooProvidingException e) {
System.err.println("Foo exception: " + e.getMessage());
return;
}
// use foo, maybe in another method (when foo is the field).
我知道,这个问题可能有些自以为是,但任何帮助都是有效的答案。
抱歉我的英语不好,在此先感谢!
你问的不是很清楚,不知道我的回答在多大程度上有意义。
如果我理解得很好,你有任何类型的字段(Foo
、Bar
...)并且你想使用你想要的任何类型的提供程序来实例化它们,这可以抛出提供时出现异常。
所以一开始,我认为如果提供程序抛出异常,您不应该 return
,而是 re-throw 或处理它。因为如果您在获取 Foo
时出现异常,因此您实际上没有 Foo
,您为什么要继续(或者为什么不尝试以某种方式处理它)?
现在这就是说,假设 re-throwing/handling 得到处理,那么我将定义一个 ThrowingSupplier
功能接口:
@FunctionalInterface
public interface ThrowingSupplier<T, E extends Exception> {
T get() throws E;
}
...然后我将创建一个静态方法,如下所示:
public static <T, E extends Exception> T provide(ThrowingSupplier<T, E> supplier) {
try {
return supplier.get();
} catch (Exception e) {
System.err.println("Exception: " + e.getMessage());
throw (E) e;
}
}
所以在那个时候,每次我想执行这种操作时,我都会简单地调用这个实用方法:
Foo foo = provide(() -> FooProvider.getFoo(...)); //either creates a Foo, or prints and re-throw a FooProvidingException
Bar bar = provide(() -> BarProvider.getBar(...)); //either createa a Bar, or prints and re-throw a BarProvidingException
Integer myInt = provide(() -> 3);
String myStr = provide(() -> "hello");
//... and so on
但当然,至少有一次您必须提取逻辑。然后就是以一种通用的方式提取它,并且不需要为每种不同类型的对象重复。
我也不确定这里的 end-goal 是什么,但据我了解,这是实现以下目标的 更简单 版本:
- 声明并初始化变量
- 正在通过服务提供商为其获取值
- 处理由此抛出的任何异常(或者如果值为 null)并退出方法
- 如果一切正常则继续执行
public static void main(String[] args) {
Foo foo1, foo2, foo3, foo4;
try {
foo1 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(1));
foo2 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(2));
foo3 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(3));
foo4 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(4));
// this works in or out of try/catch block
foo1.printName();
foo2.printName();
foo3.printName();
foo4.printName();
} catch (FooProviderException fpe) {
System.out.println("Exception: " + fpe);
return;
}
// this works in or out of try/catch block
foo1.printAgain();
foo2.printAgain();
foo3.printAgain();
foo4.printAgain();
}
所以,我想为我的代码编写这些东西,但是一个变量的代码太多了。我如何使用现代 Java 来更短或更清晰地解决这个问题?在单独的方法中移动它并不能解决问题,因为我仍然需要检查变量是否为 null,这很冗长并且添加了仅使用一次的额外方法。可以在这里使用 Optionals 吗?似乎 return
阻止了这种情况。也许有办法将这个东西折叠成一个用于许多变量的东西,例如下面描述的 foo
?我不知道,只是为了让它更具可读性和简洁性。
Foo foo;
try {
foo = FooProvider.getFoo(...);
} catch (FooProvidingException e) {
System.err.println("Foo exception: " + e.getMessage());
return;
}
// use foo, maybe in another method (when foo is the field).
我知道,这个问题可能有些自以为是,但任何帮助都是有效的答案。
抱歉我的英语不好,在此先感谢!
你问的不是很清楚,不知道我的回答在多大程度上有意义。
如果我理解得很好,你有任何类型的字段(Foo
、Bar
...)并且你想使用你想要的任何类型的提供程序来实例化它们,这可以抛出提供时出现异常。
所以一开始,我认为如果提供程序抛出异常,您不应该 return
,而是 re-throw 或处理它。因为如果您在获取 Foo
时出现异常,因此您实际上没有 Foo
,您为什么要继续(或者为什么不尝试以某种方式处理它)?
现在这就是说,假设 re-throwing/handling 得到处理,那么我将定义一个 ThrowingSupplier
功能接口:
@FunctionalInterface
public interface ThrowingSupplier<T, E extends Exception> {
T get() throws E;
}
...然后我将创建一个静态方法,如下所示:
public static <T, E extends Exception> T provide(ThrowingSupplier<T, E> supplier) {
try {
return supplier.get();
} catch (Exception e) {
System.err.println("Exception: " + e.getMessage());
throw (E) e;
}
}
所以在那个时候,每次我想执行这种操作时,我都会简单地调用这个实用方法:
Foo foo = provide(() -> FooProvider.getFoo(...)); //either creates a Foo, or prints and re-throw a FooProvidingException
Bar bar = provide(() -> BarProvider.getBar(...)); //either createa a Bar, or prints and re-throw a BarProvidingException
Integer myInt = provide(() -> 3);
String myStr = provide(() -> "hello");
//... and so on
但当然,至少有一次您必须提取逻辑。然后就是以一种通用的方式提取它,并且不需要为每种不同类型的对象重复。
我也不确定这里的 end-goal 是什么,但据我了解,这是实现以下目标的 更简单 版本:
- 声明并初始化变量
- 正在通过服务提供商为其获取值
- 处理由此抛出的任何异常(或者如果值为 null)并退出方法
- 如果一切正常则继续执行
public static void main(String[] args) {
Foo foo1, foo2, foo3, foo4;
try {
foo1 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(1));
foo2 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(2));
foo3 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(3));
foo4 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(4));
// this works in or out of try/catch block
foo1.printName();
foo2.printName();
foo3.printName();
foo4.printName();
} catch (FooProviderException fpe) {
System.out.println("Exception: " + fpe);
return;
}
// this works in or out of try/catch block
foo1.printAgain();
foo2.printAgain();
foo3.printAgain();
foo4.printAgain();
}