【问题标题】:Pass reference to method instead of value (or something like that) - JAVA传递对方法的引用而不是值(或类似的东西) - JAVA
【发布时间】:2020-01-25 14:40:54
【问题描述】:

我有多个对象的值存储在 -

object.getList().get(0).getSomeObject.getName(0)

有可能,这个列表是空的所以-

object.getList().get(0)

抛出一个 NPE

我想通过-

object.getList().get(0).getSomeObject.getName()

到另一个方法并在那里处理异常。

例如:

// calling the method
myMethod(object.getList().get(0).getSomeObject.getName());

public void myMethod(Object o){
    try {
        String name = o;
    }catch (Exception e){
        // do something
    }
}

有没有可能做这样的事情-

EvaluateLaterObject elo = new EvaluateLaterObject(object.getList().get(0).getSomeObject.getName());
myMethod(elo);

public void myMethod(EvaluateLaterObject elo){
    try {
        String name = elo.getValue();
    }catch (Exception e){
        // do something
    }
}

提前谢谢你!

【问题讨论】:

标签: java methods parameter-passing


【解决方案1】:

您可以使用函数式接口,例如 Supplier 和 lambda

myMethod(() -> object.getList().get(0).getSomeObject.getName());

public void myMethod(Supplier<String>){
    try {
        String name = elo.get();
    }catch (Exception e){
        // do something
    }
}

如果您想支持任何异常,您需要定义自己的功能接口,例如

@FunctionalInterface
interface ThrowableSupplier<T>
{
    T get() throws Throwable;
}

【讨论】:

  • 仅适用于未经检查的(运行时)异常。
  • @SME_Dev 对。虽然微不足道。
【解决方案2】:

迈克尔已经给出的任何东西

Supplier<String> objectSupplier = () -> object.getList().get(0).getSomeObject.getName();

public void myMethod(Supplier<String> objectSupplier){
    try {
        String name = objectSupplier.get();
    }catch (Exception e){
        // do something
    }
}

这并没有真正处理异常。

或者使用可选性。假设列表项具有 ListItem 类并且 getSomeObject 属于 Item 类:

Optional<String> nameOpt = object.getList().stream()  // Stream<ListItem>
        .findFirst()                                  // Optional<ListItem>
        .map(ListItem::getSomeObject)                 // Optional<Item>
        .map(Item::getName);                          // Optional<String>

public void myMethod(Optional<String> nameOpt){
    nameOpt.ifPresent(name -> System.out.println(name));
    String nm = nameOpt.orElse("(No Name)");
}

【讨论】:

  • 对。这里的正确做法是首先避免 NPE。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2019-11-19
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多