【问题标题】:Catching an error at compile rather than run time in Java在编译时而不是在 Java 中运行时捕获错误
【发布时间】:2016-04-22 21:21:14
【问题描述】:

我有一个这样的方法(称为 foo):public void foo (String parm) 我知道有时需要一个整数,我会将其转换为字符串(不仅仅是“”+ x,它比这更复杂,您不能仅通过查看 int 值来确定字符串值。int 值将是用作索引。

所以现在我这样做:

public void foo(Object obj) {
 if (obj instanceof String) {
     ...
 } else if (obj instanceof Integer) {
     ...
 } else // some sort of error
}

如果您执行以下操作,则不会在编译时捕获错误:

foo(new Date());

有没有办法在编译时捕获它(除了创建两个单独的方法 public void foo(Integer x) 和 public void foo (String str)?

【问题讨论】:

  • 重载你的方法。一个接受字符串,另一个接受整数。
  • “除了制作两个单独的方法”这样做有什么问题?重载正是您在编译时处理类型不一致的方式。你到底希望什么?一般来说,如果你有一个方法可以接受不同类型的输入并用它们做不同的事情,这是一个不好的迹象。而是定义两个单独的方法。
  • 虽然您可以在 C++ 中实现这一点(恕我直言,这种方式使这个问题合法化),但您不能在 Java 中做到这一点。任何解决方案都可以归结为恰好有两个重载函数。
  • 这是一个简化但基本上是 public void foo (Object obj) { int ind = 0;字符串 str = null; if (obj indexof Integer) { ind = (Integer) obj; str = someList.get(ind); } else if (obj instanceof String) { str = (String) obj;我有 7 或 8 个这样我可以将它们加倍,也许这是最好的解决方案,但还有很多事情要做。
  • 重载方法是告诉编译器哪些参数类型是可接受的。

标签: java object


【解决方案1】:

当然,构建foo 的重载 版本:

foo(String obj)

foo(Integer obj)

并删除一般的。如果必须,请让他们致电将军 (private) _foo(Object obj)。

【讨论】:

    【解决方案2】:

    我什至会更进一步;您不仅应该有两种方法(一种采用字符串,一种采用整数)......您应该为这些方法提供两个不同的名称。

    您想遵循SRP(单一责任原则)。代码中的任何元素(类、方法)都应该对“一件事”负责。

    你的类和方法的名称应该非常清楚它们应该做什么。从这个意义上说,你有两个具有相同名称和不同参数的方法似乎很尴尬。因为,从本质上讲,这两种方法会做不同的事情。所以 - 给他们起名字,说明他们真正在做什么。

    【讨论】:

    • 他们做的事情基本上是一样的。屏幕上有一个办公室列表,每个办公室都有一个 ID。该方法(它实际上不是 void)返回有关办公室的信息。如果您传递一个字符串,它将为该办公室返回它,如果您传递一个整数,它将取 + 1(即,如果办公室的顺序是“111112”、“231222”、“123456”并且您传入 0 它将获取“111112”的信息,传入 1 将返回“231222”的信息,等等。
    • 我经常想知道为什么两个不同参数的方法必须同名。他们可以有一些更具描述性的名称。
    【解决方案3】:

    它不会捕获错误,因为没有错误。
    您允许将对象作为参数传递,并且如您所知,所有对象都基于 Object 类,因此 new Date() 是 Object 的一个实例。
    我建议创建这两种方法,因为这样可以使代码更简洁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      相关资源
      最近更新 更多