我想设计一个具有2个属性的油泵.Id和capacity。现在有一个限制,油泵应该有容量< 6和> 0。 1)如下所示设计我的课程是一个好习惯吗?如果它不满足条件,则将结构中的异常抛出。 2)如果我提供了一个setter方法,它会是什么样的? 3)我应该开发一个从setCapicity实际调用的辅助方法validateCapacity吗?
public class OilPump {
private String ID;
private int Capacity;
public OilPump(String id,int c)throws MyException{
if(id.length()==6 && (c<6 && c>0)) {Capacity=c;ID=id;}
else{
throw new MyException("Invalid OilpumpID or Capacity");
//System.out.println("Invalid OilpumpID");
}
}
void start()
{
System.out.println("Oil Pump is started");
}
void stop()
{
System.out.println("Oil Pump is Stopped");
}
}
答案 0 :(得分:0)
看起来很好。你有私人领域和公共方法,这是对的。我要指出的唯一事情是:
1)java惯例适用于camelCasing,因此您的字段应为id
和capacity
。
2)现在你的类是不可变的(即它中的数据不能改变)。如果你想要,那很好,但是如果想要能够修改容量,你应该添加java-bean风格的setter和getter。
答案 1 :(得分:0)
1)构造函数不应该抛出异常(请记住,允许用户继续执行导致异常的步骤是不好的做法:考虑数据合同); 2)你可以为你的setter使用SetCapacity(Int32); 3)是的,为特定功能创建单独的方法是OO设计的目标;
希望它有所帮助, --KRG
答案 2 :(得分:0)
您应该使用小写启动变量/字段。
虽然你所拥有的没有错,但如果在参数错误时抛出未经检查的异常IllegalArgumentException而不是自定义的已检查异常,则会使类使用更简单。然后你应该提供适当的javadoc来定义可接受的参数。
除非您希望该类是可变的,否则不需要setter / getter。
如果您的验证仍然是微不足道的话,我不打算使用验证方法,但如果它变得更复杂,我会这样做。无论如何,这样做肯定没有任何问题。
如果需要预先测试和失败也是典型的,然后只需在if块之外执行其余代码。
if ((newId != null) || (newId.length() != 6) || (newCapacity > 6) || (newCapacity < 0))
{
throw new IllegalArgumentException("Valid values must be ...");
}
id = newId;
capacity = newCapacity;
答案 3 :(得分:0)
也许是个人风格的问题,但我会创建一个封装验证并使构造函数为私有的工厂方法。如果将来需要,那么在层次结构中使用OilPump类更容易。课程将是这样的:
public class OilPump {
private String id;
private int capacity;
public static OilPump create(String id, int capacity) {
if(id.length()==6 && (c<6 && c>0)) {
return new OilPump(id,capacity;
}
else{
throw new IllegalArgumentException ("Invalid OilpumpID or Capacity");
}
}
private OilPump(String id,int capacity) {
this.capacity=capacity;
this.id=id;
}
void start()
{
System.out.println("Oil Pump is started");
}
void stop()
{
System.out.println("Oil Pump is Stopped");
}
}