将对象传递到多个图层时检查null的最佳方法是什么

时间:2016-12-08 03:33:06

标签: java oop methods nullpointerexception null

假设我有一个具有以下签名的方法。

 public void processData(Map<String,String> map)

现在说这个方法遍历一个列表,并在列表中的每个项目上调用下面的方法,传递它所拥有的地图。

public void handle(Map<String,String> map)

现在我在processData方法中检查了null。如果它为null,则不会从那里继续,抛出自定义异常。但是我应该在handle方法中验证map的null吗?因为它已在processData方法中验证过。如果不调用其null句柄方法。我有这个疑问,因为句柄方法具有公众可见性。我不能将它作为受保护或默认,因为这些方法都在不同包的类中。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。我没有一个独特的解决方案,但这里有一些选择:

  • 您确实可以在两个函数中检查null。它不会减慢执行速度,这也不错。但事实上,如果你有一个10或20个子功能的级联,那么有太多的检查可能看起来很烦人。

  • 如果你确定它不会被其他任何地方召唤,你可以把它留在那里而不用检查,但这并不总是令人满意。

  • 如果地图为空,您可以添加一个抛出正确异常的方法,这样就可以调用相同的简单方法,而不是在任何地方重新编写支票。我会在你的一个异常类中加入这样的方法。

    public static void checkMapNull(Map<String> map){ // throw exception if map is null }
    public static void handle(Map<String> map) { checkMapNull(map); //dostuff } 
    
  • 另一个有趣的模式包括使用密钥访问您的方法。我将详细介绍最后一篇,因为我觉得这是解决问题的一种非常有趣的方法。首先在应该处理映射的包中创建一个包含私有构造函数的公共类。然后修改你的handle方法,使它需要一个键作为参数:现在只有可以访问静态键的类才能调用handle方法

    // Key class - first package
    public class Key {
        private Key(){}
        static Key key;
    }
    
    // Map handler class - second package
    // Only the first package has a key to call handle!
    public void handle(Map<String> map, Key key){ //dostuff }
    

在你的情况下,我会选择第三种或第二种选择。但是java中的关键模式在某些情况下非常有用,因为它允许从c ++模拟 friend 行为。

答案 1 :(得分:1)

如果你有一个公共方法,那么你有一个合同的API。

如果合同是特别处理空值,那么你应该编码该行为。

如果合同没有规定如何处理空值,那么抛出NPE(显式或自然)是可以接受的(我会选择这个选项)。

如果任何人都不应该调用该方法,请更改它的可见性(说&#34;它不是我的代码&#34;不是不这样做的理由)。