Java - 通过泛型函数执行实现空安全

问题描述 投票:0回答:1

在 Java 中处理嵌套对象时 - 比如:

// bad code
game.getPlayer().getState().getPositionInfo().getCurrent().getX();

,尚不清楚嵌套引用是否会返回 null,从而导致抛出 NullPointerException。

我的想法是使用一种通用方法,在检查空引用时向下调用引用路径, 并且不抛出异常,而是返回 null。

错误处理超出了此解决方案的范围。

我的最小代码示例如下所示:

import java.util.function.Function;

public class Main {

    public static void main(String[] args) {
        // Check 1: baseline - "normal" function mappings
        SAVE.TY_Baseline(b -> b.contains("a"), "aoiudssaiud"); // works

        // Check 2: nested types
        Team t = new Team(new Team(null));
        Team t1 = SAVE.TY_Chained(() -> t.getTeam(), z -> z.getTeam()); // does not compile

        // Check 3: String -> boolean -> String
        String g = "Hi !";
        // does not compile
        Team t2 = SAVE.TY_Chained(() -> g.contains("Hi"), b -> b ? "contained" : "not contained"); 
    }

    public static class Team {
        private Team t = null;
        public Team(Team t) {
            this.t = t;
        }
        public Team getTeam() {
            return t;
        }
    }

    public static interface SAVE {
        public static <A, B> B TY_Chained(Function<Void, A> first , Function<A, B> second) {
            A firstResult = first.apply(null);
            if (firstResult == null)
                return null;
            return second.apply(firstResult);
        }
        public static <A,B> B TY_Baseline(Function<A,B> oo, A in) {
            return oo.apply(in);
        }
    }
}

对于检查 1: 一切都很好,函数执行,编译器将输入识别为字符串并接受该函数。

对于检查 2 和 3: 当链接函数时,编译器不知道函数“second”具有哪种参数类型,因此不会接受此方法调用。 获得:

java: incompatible types: incompatible parameter types in lambda expression

现在使用 OpenJDK V22。

java function generics null nullpointerexception
1个回答
0
投票

您可以使用现有的库,例如vavr

如果你愿意发明自己的轮子,至少可以从他们身上得到一些灵感。

您的具体情况只需

Optional

即可解决
Optional.ofNullable(game)
  .map(x->x.getPlayer())
  .map(x->x.getState())
  .map(x->x.getPositionInfo())
  .map(x->x.getCurrent())
  .map(x->x.getX())
  .orNull();
© www.soinside.com 2019 - 2024. All rights reserved.