目前,我正在开发一款带有多种不同模式的Java简单游戏。我已经扩展了一个主Game类,将主要逻辑放在其他类中。尽管如此,游戏的主要职业仍然相当庞大。
在快速浏览了我的代码后,我发现比起游戏逻辑真正需要的其他内容,大部分内容都是getter和setter(60%)。
一些谷歌搜索声称getter和setter是邪恶的,而另一些人则声称它们是良好的OO实践和伟大的程序所必需的。
那我该怎么办呢?应该是哪一个呢?我是否应该为我的私有变量改变我的getter和setter,还是应该继续使用它们?
目前,我正在开发一款带有多种不同模式的Java简单游戏。我已经扩展了一个主Game类,将主要逻辑放在其他类中。尽管如此,游戏的主要职业仍然相当庞大。
在快速浏览了我的代码后,我发现比起游戏逻辑真正需要的其他内容,大部分内容都是getter和setter(60%)。
一些谷歌搜索声称getter和setter是邪恶的,而另一些人则声称它们是良好的OO实践和伟大的程序所必需的。
那我该怎么办呢?应该是哪一个呢?我是否应该为我的私有变量改变我的getter和setter,还是应该继续使用它们?
当前回答
我并不真的认为他们是邪恶的。但我很想生活在一个除非真的需要,我才会用到它们的世界里。
上面我读到的一个例子是对代码进行未来验证。例如:
public void setValue(int value)
{
this.value = value;
}
然后,需求发生变化,您需要跟踪该值设置了多少次。
So:
public void setValue(int value)
{
this.value = value;
count++;
}
真漂亮。我明白了。但是,在Ruby中,下面的代码不能达到同样的目的吗?
someobject.my_value = 100
稍后,您需要跟踪my_value被设置的次数。那么,你能不重写setter then和only then吗?
def my_value=(value)
@my_value = value
@count++
end
我很喜欢漂亮的代码,但我不得不承认,在我们拥有的Java类的大山中,看到成千上万行只是基本的getter/setter的代码是丑陋和讨厌的。
当我全职用c#开发时,我们一直使用公共属性,只在需要时才使用自定义getter /setter。效果很好,没有损坏任何东西。
其他回答
关于这个问题,你们已经有了很多很好的答案,所以我只是发表我的意见。getter和setter是非常非常邪恶的。它们本质上让您假装隐藏对象的内部,而大多数情况下您所做的一切都是在多余的代码中进行的,这些代码无法隐藏内部状态。对于一个简单的POJO,没有理由不能用obj.name = "Tom"替换getName()和setName()。
如果方法调用只是替换赋值,那么选择方法调用所得到的只是代码膨胀。不幸的是,该语言在JavaBeans规范中规定了getter和setter的使用,因此Java程序员被迫使用它们,即使这样做毫无意义。
幸运的是,Eclipse(可能还有其他ide)允许您自动生成它们。在一个有趣的项目中,我曾经用XSLT为它们构建了一个代码生成器。但如果有一件事是我想在Java中摆脱的,那就是对getter和setter的过度依赖。
一如既往,唯一的答案是:视情况而定。如果你是唯一接触代码的人,你可以做任何你觉得舒服的事情,包括走捷径。
使用setter的好处之一是只需要在代码中的一个位置执行检查。
您可能需要更仔细地关注这些方法实际获取和设置的内容。如果您使用它们来提供对常量值的访问,那么使用常量可能更好。
您可能希望用值类替换一些类。这将允许您删除getter,并避免在更改下面的内容时出现问题。
我的观点是getter和setter是好的程序的必要条件。坚持使用它们,但不要编写不必要的getter /setter -并不总是需要直接处理所有变量。
如果需要外部访问字段的各个值,请使用getter和/或setter。如果不是,那就不要。永远不要使用公共字段。就这么简单!(好吧,从来没有那么简单,但这是一个很好的经验法则)。
通常情况下,您还会发现您需要提供setter的次数比getter少得多——特别是当您试图使对象不可变时——这是一件好事(但并不总是最好的选择)——但即使不是这样。