我现在正在学习Java的继承。我总共有3个问题,谢谢你的支持。
第一个问题:我可以在构造函数中验证类的字段吗?
第二个问题:有些人建议我抛出一个例外进行验证。这是否意味着向调用方法抛出异常或抛出异常并在构造函数内处理它?</ p>
第3个问题:假设该类不是子类,我可以验证代码中显示的字段,而不是使用异常吗?(假设代码不会因为super()而产生错误)。
子类
import javax.swing.JOptionPane;
public class Essay extends GradedActivity
{
private final double MAXGRAMMAR = 30;
private final double MAXSPELLING = 20;
private final double MAXLENGTH = 20;
private final double MAXCONTENT = 30;
private double grammar;
private double spelling;
private double length;
private double content;
public Essay(double grammar, double spelling, double length, double content)
{
double total;
while(grammar < 0 || grammar > MAXGRAMMAR)
{
grammar = Double.parseDouble(JOptionPane.showInputDialog(null, "Invalid grammar value, try again: "));
this.grammar = grammar;
}
while(spelling < 0 || spelling > MAXSPELLING)
{
spelling = Double.parseDouble(JOptionPane.showInputDialog(null, "Invalid spelling value, try again: "));
this.spelling = spelling;
}
while(length < 0 || length > MAXLENGTH)
{
length = Double.parseDouble(JOptionPane.showInputDialog(null, "Invalid length value, try again: "));
this.length = length;
}
while(content < 0 || content > MAXCONTENT)
{
content = Double.parseDouble(JOptionPane.showInputDialog(null, "Invalid content value, try again: "));
this.content = content;
}
total = grammar + spelling + length + content;
super(total);
}
};
超
/**
A class that holds a grade for a graded activity.
*/
public class GradedActivity
{
private double score; // Numeric score
/**
The setScore method sets the score field.
@param s The value to store in score.
*/
public void setScore(double s)
{
score = s;
}
/**
The getScore method returns the score.
@return The value stored in the score field.
*/
public double getScore()
{
return score;
}
/**
The getGrade method returns a letter grade
determined from the score field.
@return The letter grade.
*/
public char getGrade()
{
char letterGrade;
if (score >= 90)
letterGrade = 'A';
else if (score >= 80)
letterGrade = 'B';
else if (score >= 70)
letterGrade = 'C';
else if (score >= 60)
letterGrade = 'D';
else
letterGrade = 'F';
return letterGrade;
}
}
答案 0 :(得分:0)
答案 1 :(得分:0)
你可以做所有你想要的,但这不是一个好建议。
如果您希望代码可维护,可重用,可扩展,并且您可以轻松地在其他技术中实现它。保持一个类的基本概念与&#34;高内聚和低耦合&#34;。
一个类只是一个简单的对象(Pojo)。保持你的构造函数干净:
Public Essay (Type value){
this.value=value;
}
默认情况下保留你的获取和设置。
现在,当您必须创建这些pojos时,请在创建对象之前执行检查。
你总是有一个类创建Pojo(Object)Normaly构造函数:
if(validations(fields))
Abstract class = new ConcreteClass(fields);
else throw new ServiceException("Your exception");
所以你的答案将是:
第一个问题:我可以在其构造函数中验证类的字段吗?
是的,但不建议在构造函数中添加逻辑。
第二个问题:有些人建议我抛出一个例外进行验证。这是否意味着向调用方法抛出异常或抛出异常并在构造函数内处理它?</ p>
应始终管理例外情况,并将其置于控制之下 环境与propers消息,normaly你创建一个客户 例外:
public class ServiceException extends RuntimeException {
private static final long serialVersionUID = 1L;
public ServiceException(String message) {
super(message);
}
}
第3个问题:假设该类不是子类,我可以验证代码中显示的字段,而不是使用异常吗?(假设代码不会因为super()而产生错误)。
如果您不想在创建Object之前验证fileds,可以使用自定义方法(例如&gt;)执行此操作。 ConcreteClass.validateFields()
添加到您的客户方法(validateFields())您现在在构造函数上的验证,您将获得结果。
希望这有帮助。