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

Java 面向对象,传递变量或使用对象状态,java,oop,Java,Oop,大家好,我为这个基本的问题道歉,我确信我以前被告知过答案,我花了一些时间搜索,但找不到一个好的答案(可能是因为搜索查询很难表达),我以前做过一点OO编程,但我最近做了很多程序性的事情,这似乎让我的想法变得模糊 我有一个程序必须处理字符串,该程序的一部分涉及清理字符串,所以我有这个方法: private void sanitizeString() { removeEscape(); removePunctuation(); removeCaps(); } 在类的前面声明了

大家好,我为这个基本的问题道歉,我确信我以前被告知过答案,我花了一些时间搜索,但找不到一个好的答案(可能是因为搜索查询很难表达),我以前做过一点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的事情,所以我只想检查一下我的基本假设是否正确


谢谢

因为
x
被声明为类变量,所以这一个很好:

  private void removeCaps() {
        x = x.toLowerCase();
  }
由于类变量在类方法内部是可访问的,因此不需要将类变量作为参数传递给相同的类方法

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

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

  • 如果需要一个理论上与类定义相关的变量,则该变量应定义为类变量。e、 g.雇员ID,雇员名称。。employee类中的变量应定义为employee类变量

  • 如果存在仅对类方法局部的变量需求,而在方法/类之外的任何地方都不需要,则应将其定义为方法内部的局部变量

  • 如果您正在定义一些实用程序方法来使用一些变量进行响应,那么这些变量应该作为参数传递给util方法

  • 回到你的问题:

    如果您要定义一个完整的类,例如
    清理
    ,该类在字符串变量周围有多个方法,例如字符串类本身,那么最好将字符串定义为类变量,并使用类变量编写方法


    但是,如果将清理定义为util/helper类,那么最好像通常那样将字符串作为方法参数传递;我不希望您的util方法是状态完整的(与类实例关联)。

    为了演示好的OO,您应该明确使用

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

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

    您在这里有一个折衷:

  • 将变量声明为类变量意味着您必须为要清理的每个字符串创建一个新对象

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


  • 你必须权衡每种方法的优缺点,以决定哪种方法最适合你的具体情况。

    如果我想得对,用不同的类修改“全局变量”仍然是个坏主意,就像在过程中一样,但“类变量”是可以的?@Mike Yes。这个答案适用于类方法和类变量,而不是全局变量。相同的类变量只能通过这种方式访问。POJO就是一个非常简单的例子,在这里声明类变量并通过getter/setter方法公开它们。你不知道;“我不需要将类变量传递给这些方法,有时候,你不能。”迈克感谢迈克的输入!嗯,我必须说,你的回答中没有提供非常有用的信息。问题主要是关于使用
    string
    作为实例变量和局部变量的利弊。当然,两种方法都可以使用。也许你可以加上一点,使它成为一个完整的答案,因为它现在是一个被接受的答案。我更新了答案。请随意编辑您的答案。在本例中,绝对是选项1。然后,类的每个实例读取一个字符串,解析它,并返回一些我本应给出的输出+1,但我今天已经做得足够了。但这是迄今为止最好的答案