Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中的参数提示中强制执行整数限制_Java - Fatal编程技术网

如何在Java中的参数提示中强制执行整数限制

如何在Java中的参数提示中强制执行整数限制,java,Java,在PHP中工作了几年之后,我对Java是新手,我正试图了解一些使用Java时的最佳实践和规范 我想知道仅仅为了对整型参数的范围施加限制而将整个类作为自定义类型是否有意义 例如: class Person() { private int age; public Person(int age) { if(age < 0) { throw new IllegalArgumentException(); } this.age = age; }

在PHP中工作了几年之后,我对Java是新手,我正试图了解一些使用Java时的最佳实践和规范

我想知道仅仅为了对整型参数的范围施加限制而将整个类作为自定义类型是否有意义

例如:

class Person() {
  private int age;

  public Person(int age) {
    if(age < 0) {
      throw new IllegalArgumentException();
    }
    this.age = age;
  }

  public int getAge() {
    return age;
  }
}
或:

另外,在第二个示例中,我将Age对象转换为Person.getAge中的int,这很方便,但由于Person的构造函数使用Age对象,因此感觉有些错误。有什么想法吗


谢谢

我认为第一个例子是可以的。您还应该在javadoc中描述抛出的异常,这样类的用户就会知道这个行为特性

我认为第一个例子是可以的。您还应该在javadoc中描述抛出的异常,这样类的用户就会知道这个行为特性

我认为您的第二个示例在这种情况下有点过火,因为您只有一个带单个约束的整数,并且年龄没有任何与之相关的行为。如果其中任何一个是不同的,例如,如果您有更多具有相关约束的数据,那么将它们划分为各自的类可能是有意义的。所以你的第二个设计不是真的错,只是不适合这个玩具的例子


对于第二个示例,我可能会让Person.getAge方法返回一个Age对象,而不是int。同样,在这个玩具示例中,很难看到区别,但是返回int感觉人和年龄之间有点太耦合了。

我认为第二个示例在这种情况下有点过分了,因为只有一个整数和一个约束,并且年龄没有任何与之相关的行为。如果其中任何一个是不同的,例如,如果您有更多具有相关约束的数据,那么将它们划分为各自的类可能是有意义的。所以你的第二个设计不是真的错,只是不适合这个玩具的例子


对于第二个示例,我可能会让Person.getAge方法返回一个Age对象,而不是int。同样,在这个玩具示例中,很难看到区别,但是返回int感觉个人和年龄之间有点太耦合了。

我认为这是关于强制限制、封装行为,等等,这就是面向对象语言的全部内容。它越来越习惯于少用double、int和string等原语来思考这个世界,而更多地用表示更好的抽象的对象来思考这个世界,这些抽象可以封装和隐藏客户端的细节


我也会选择第一个例子。我还建议不要有年龄数据成员,因为它每年都在变化。最好有一个生日,并根据它计算当前年龄。

我认为这是关于强制限制、封装行为等。这就是面向对象语言的全部内容。它越来越习惯于少用double、int和string等原语来思考这个世界,而更多地用表示更好的抽象的对象来思考这个世界,这些抽象可以封装和隐藏客户端的细节


我也会选择第一个例子。我还建议不要有年龄数据成员,因为它每年都在变化。最好有一个出生日期并根据它计算当前年龄。

我也会使用第一个版本,除非你的年龄概念在你的项目中广泛传播,在这种情况下,你应该走第二条路,并且保持一致,并在getAge中返回一个年龄对象。Age应该有一个简单的访问器来获取封装的int。

我也会使用第一个版本,除非您的Age概念在您的项目中广泛传播,在这种情况下,您应该采取第二种方式,并且保持一致,并在getAge中返回Age对象。Age应该有一个简单的访问器来获取封装的int。

我更喜欢使用Age类的第二个版本,因为它可以让您在不需要Peron实例的情况下更轻松地测试Age功能。此外,你还可以在其他事情上使用年龄,例如在战争中

一般来说,用整数表示年龄并不是一个好主意,因为随着时间的推移,事物会变得越来越老。创建日期在Age类中更通用,只需使用日期而不是int


此外,如果你抛出新的IllegalArgumentException不能<0,was:+age,你将为自己节省大量时间;这样,当您知道错误值是什么时,就可以更容易地跟踪错误数据。

我更喜欢带有Age类的第二个版本,因为它可以让您更轻松地测试Age功能,而不需要Peron实例。此外,你还可以在其他事情上使用年龄,例如在战争中

一般来说,用整数表示年龄并不是一个好主意,因为随着时间的推移,事物会变得越来越老。创建日期在Age类中更通用,只需使用日期而不是int

而且,你会为自己节省很多
如果你的时间真的抛出新的IllegalArgumentException不能小于0,是:+age;这样,当您知道错误值是什么时,就可以更容易地跟踪错误数据。

第一个错误值也会得到我的投票

我不确定这是否是一个例子,但我不认为设置一个超出范围的年龄会是一个编程错误。当发生编程错误时,抛出IllegalArgumentException更有意义。Null或负年龄可能会使我列出引发异常的条件


根据邮局的头衔,可以考虑是否应该为上限做同样的事情。我认为,使用年龄示例,根据年龄的设置,对象验证器可以更好地实施上限。当可以捕捉到对对象用户的反馈以进行反应时,例如在持久化之前,应在某个点进行验证,因为这不一定是编程错误,而是用户应首先解决或得到通知的情况

第一个也会得到我的选票

我不确定这是否是一个例子,但我不认为设置一个超出范围的年龄会是一个编程错误。当发生编程错误时,抛出IllegalArgumentException更有意义。Null或负年龄可能会使我列出引发异常的条件


根据邮局的头衔,可以考虑是否应该为上限做同样的事情。我认为,使用年龄示例,根据年龄的设置,对象验证器可以更好地实施上限。当可以捕捉到对对象用户的反馈以进行反应时,例如在持久化之前,应在某个点进行验证,因为这不一定是编程错误,而是用户应首先解决或得到通知的情况

值得注意的是,您没有检查null。或者子类-您可能应该使类成为最终类,最好隐藏构造函数并添加一个创建方法,您可能会发现它对intern Age对象有用,或者不有用。值得注意的是,您没有检查null。或者子类-您可能应该将类设置为最终类,最好隐藏构造函数并添加一个创建方法,您可能会发现它对intern Age对象有用,或者不有用。第一段告诉我,我不应该用基元类型来思考,但是你继续推荐第一个例子。我同意关于生日比年龄好的观点,但我只是用年龄的例子来说明这个问题。谢谢我对这个答案有点困惑。第一段告诉我,我不应该用基元类型来思考,但是你继续推荐第一个例子。我同意关于生日比年龄好的观点,但我只是用年龄的例子来说明这个问题。谢谢
class Person() {
  private Age age;

  public Person(Age age) {
    this.age = age;
  }

  public int getAge() {
    return age.toInt();
  }
}


class Age() {
  private int age;

  public Age(int age) {
    if(age < 0) {
      throw new IllegalArgumentException();
    }
    this.age = age;
  }  

  public toInt() {
    return age;
  }
}