面向对象,传递变量或使用对象状态

时间:2012-11-30 21:16:55

标签: java oop

对基本问题道歉,我确定我之前已被告知答案,我花了一些时间搜索但找不到一个好的答案(可能是因为它很难用短语作为搜索查询),我我之前已经完成了一些OO编程,但最近我做了很多程序性的事情,所以这似乎让我的想法蒙上阴影。

我有一个必须使用字符串的程序,该程序的一部分涉及清理字符串,所以我有这个方法:

private void sanitizeString() {
    removeEscape();
    removePunctuation();
    removeCaps();
}

在类的早期声明了变量

String x = "... some string ..."

在程序中,你显然会将所有函数传递给他们需要处理的字符串,我的问题是在OO中可以将这个字符串声明在类的顶部,然后只需执行类似

private void removeCaps() {
    x = x.toLowerCase();
}

或应该是

private String removeCaps(String y) {
    y = y.toLowerCase();
    return y;
} 

我认为这应该是第一种方式,而且我知道这样做可行,但我正在做一些必须表现出良好OO的事情,所以我只想检查一下我的基本假设是否合适。

由于

3 个答案:

答案 0 :(得分:1)

你在这里有一个折衷:

  1. 将变量声明为类变量意味着您必须为要清理的每个String创建一个新对象。

  2. 将String变量传递给每个方法意味着您可以重复使用同一个对象来清理多个字符串。

  3. 您必须权衡每种方法的优缺点,以确定哪种方法最适合您的具体情况。

答案 1 :(得分:0)

由于x被声明为类变量,因此这个很好:

  private void removeCaps() {
        x = x.toLowerCase();
  }

因为类变量可以在类方法中访问,并且您不需要将类变量作为参数传递给相同的类方法

仅以这种方式访问​​相同的类变量。非常简单的示例可以是POJO类,您可以在其中声明类变量并通过getter / setter方法公开它们。你不需要将类变量传递给这些方法,有时候你不能(例如在getter方法中)。

在方法中添加一些关于类变量与局部变量的想法。

  1. 如果需要一个理论上与类定义相关的变量,那么变量应该被定义为类变量。例如EmployId,employeeName ..员工类中的变量应定义为Employee类变量。

  2. 如果存在仅对类方法本地的变量需求,并且在方法/类之外的任何地方都不需要,那么它应该被定义为方法内的局部变量。

  3. 如果要定义一些使用某些变量进行响应的实用程序方法,则应将这些变量作为参数传递给util方法。

  4. 回到你的问题:

    如果您要定义整个班级,例如Sanitising围绕字符串变量有几种方法,例如String类本身,然后更好地将您的字符串定义为类变量并使用类变量编写方法。

    但是如果你将Sanitising 定义为util / helper类,那么最好将字符串作为方法参数传递,因为通常你不希望你的util方法是有状态的(关联)与类实例)。

答案 2 :(得分:0)

为了证明良好的OO,你应该明确地使用

private String removeCaps(String y) {
    return y.toLowerCase();
} 

您可以将您的Object(在本例中为全局字段x中的String)作为参数传递给方法。然后,String位于本地字段y中并返回修改后的版本。