【问题标题】:What is the best approach to check null when object is passed into several layers将对象传递到多个层时检查空值的最佳方法是什么
【发布时间】:2016-12-08 03:33:05
【问题描述】:

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

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

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

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

现在我在 processData 方法中检查了 null。如果它为空,它不会从那里继续,抛出一个自定义异常。但是我也应该在句柄方法中验证地图是否为 null 吗?因为它已经在 processData 方法中得到验证。如果它的空句柄方法不会被调用。我有这个疑问,因为 handle 方法具有公开可见性。我不能将它设置为受保护或默认,因为这两种方法都在不同包的类中。任何建议将不胜感激。

【问题讨论】:

  • 这在很大程度上取决于这些方法的性质。这个handle 是做什么的?想象一下,你的朋友让你把这个handle 方法分享给他——这个方法应该接受null 吗?如果不是,则抛出异常。如果是,并且此空检查是 您的 应用程序的特殊情况,则否。
  • 什么是只有一种类型的地图??你是说列表吗?
  • @Bohemian 抱歉,这是一个错字。不,我不是在征求意见。我要求为此提供具体的方法。应该有一个可靠的正确答案。请删除 onHold 标签。它有赞成票,这表明社区成员确实觉得它很有用。
  • @YeldarKurmangaliyev 感谢您的意见。事实是我确信这不会在任何地方被调用。但它是一种公共方法这一事实让我想知道保持这种方式是否是一种好习惯。而且由于这涉及到好几层,所以在所有层都进行这种空检查并从所有方法中抛出异常感觉很奇怪:/

标签: java oop methods nullpointerexception null


【解决方案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方法,让它需要一个key作为参数:现在只有可以访问静态key的类才能调用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 行为。

【讨论】:

  • 非常感谢您分享您的想法。 2nd 和 3rd 确实是非常有趣的解决方案。让我们看看有没有其他人想出什么新东西:)
【解决方案2】:

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

如果合同规定对空值进行特殊处理,那么您应该对该行为进行编码。

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

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

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2015-08-23
    相关资源
    最近更新 更多