【发布时间】:2013-09-26 16:30:23
【问题描述】:
我实现了一个名为 mobileCall 的类。我从这个类创建了几个对象,并用来自一个 XML 的值填充这个对象的 String 变量,该 XML 有几个特定人的 mobileCalls。我需要对这个人拨打的所有电话进行分组和计数(即国内电话:11 分钟;国际电话:15 分钟;数据:20 MB)
所以,我在类中实现了几个公共方法来检查调用的类型以返回 true 或 false。在主类中,我调用了这些方法来检查它们是否满足我计算特定计数器的条件。
专业人士看到我的代码并说这不是一个好的做法,而 OOP 旨在消除这种“你是什么”方法。并且有更好的方法来实现这种行为。我试图通读 OOP 和封装,但找不到更好的方法。我觉得他说得有道理。
代码示例
public class MobileCall {
String callType;
String callDuration;
String callAmount;
String callerID;
String calleID;
....
public boolean isNational(){
if (callType.compareTo("National")==0)
return true;
else
return false;
}
public boolean isInternational(){
if (callType.compareTo("international")==0)
return true;
else
return false;
}
...
}
In Main Method
int nationalCounter;
int internationalCounter;
MobileCall mobileCall = new MobileCall();
if(mobileCall.isNational())
nationalCounter = nationalCounter + mobileCall.getCallDuration();
else if (mobileCall.isInternational())
internationalCounter = internationalCounter + mobileCall.getDuration();
....
【问题讨论】:
-
我个人认为
isNational和isInternational之类的方法没有任何问题 -
可能是专业人士的意思是您应该将
MobileCall子类化为NationalMobileCall和InternationalMobileCall。但不确定是否需要,无论如何如果它只是一个国家/国际,那么使用private boolean isNational;可能会更好。 -
@skiwi 跟我想的差不多。如果
NationalMobileCall和InternationalMobileCall执行操作的方式存在显着差异,那么是的,使用子类而不是“你是什么?” 是面向对象设计的。但是这样做可能会走得太远,然后你就会得到很多毫无意义的子类。 -
一个挑剔的旁注——如果你想检查一个字符串是否相等,请使用
equals。compareTo == 0有点 C. -
另一个挑剔:
if (X) then return true; else return false;在 Java 中从来没有必要;只需return X;就足够了。 (在 X 不必是boolean的其他语言中,可能需要这样的代码。)
标签: java oop encapsulation