Java 面向对象,传递变量或使用对象状态
大家好,我为这个基本的问题道歉,我确信我以前被告知过答案,我花了一些时间搜索,但找不到一个好的答案(可能是因为搜索查询很难表达),我以前做过一点OO编程,但我最近做了很多程序性的事情,这似乎让我的想法变得模糊 我有一个程序必须处理字符串,该程序的一部分涉及清理字符串,所以我有这个方法:Java 面向对象,传递变量或使用对象状态,java,oop,Java,Oop,大家好,我为这个基本的问题道歉,我确信我以前被告知过答案,我花了一些时间搜索,但找不到一个好的答案(可能是因为搜索查询很难表达),我以前做过一点OO编程,但我最近做了很多程序性的事情,这似乎让我的想法变得模糊 我有一个程序必须处理字符串,该程序的一部分涉及清理字符串,所以我有这个方法: private void sanitizeString() { removeEscape(); removePunctuation(); removeCaps(); } 在类的前面声明了
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方法中)
在方法中添加关于类变量与局部变量的一些想法
清理
,,该类在字符串变量周围有多个方法,例如字符串类本身,那么最好将字符串定义为类变量,并使用类变量编写方法
但是,如果将清理定义为util/helper类,那么最好像通常那样将字符串作为方法参数传递;我不希望您的util方法是状态完整的(与类实例关联)。为了演示好的OO,您应该明确使用
private String removeCaps(String y) {
return y.toLowerCase();
}
您可以将对象(在本例中是全局字段
x
中的字符串)作为参数传递给方法。然后字符串位于本地字段y
,并返回修改后的版本。您在这里有一个折衷:
你必须权衡每种方法的优缺点,以决定哪种方法最适合你的具体情况。如果我想得对,用不同的类修改“全局变量”仍然是个坏主意,就像在过程中一样,但“类变量”是可以的?@Mike Yes。这个答案适用于类方法和类变量,而不是全局变量。相同的类变量只能通过这种方式访问。POJO就是一个非常简单的例子,在这里声明类变量并通过getter/setter方法公开它们。你不知道;“我不需要将类变量传递给这些方法,有时候,你不能。”迈克感谢迈克的输入!嗯,我必须说,你的回答中没有提供非常有用的信息。问题主要是关于使用
string
作为实例变量和局部变量的利弊。当然,两种方法都可以使用。也许你可以加上一点,使它成为一个完整的答案,因为它现在是一个被接受的答案。我更新了答案。请随意编辑您的答案。在本例中,绝对是选项1。然后,类的每个实例读取一个字符串,解析它,并返回一些我本应给出的输出+1,但我今天已经做得足够了。但这是迄今为止最好的答案