这是一篇来自考试的问题。我已经完成了这个问题并且有效。但是,我觉得我的实施可能很弱,例如我在格里高利班上使用静态。
我给了三种方法来编写我认为合适的任何方式(在格里高利班级中)给出每个方案。我是否正确使用Gregorian类中的三种方法静态。
日,月和年字段也是不可变的,将它们设置为私有? (一旦创建它们,就无法更改字段值)
public class Date {
private int day;// needs to be immutable?
private String month;// needs to be immutable?
private int year;// needs to be immutable?
public Date(int theDay, String theMonth, int theYear) {
this.day = theDay;
this.month = theMonth;
this.year = theYear;
}
public int getDay() {
return day;
}
public String getMonth() {
return month;
}
public int getYear() {
return year;
}
}
public class Gregorian {
public static Date d;
public static boolean leapYear(){
if(d.getYear() %400==0 || (d.getYear()%4==0 && d.getYear()%100!=0)){
return true;
}else{
return false;
}
}
public static int getGregorianDateNumber(){
int a = (d.getYear()*384)*(32+d.getDay());
return a;
}
public static int getISO8601Date(){
int b = (d.getYear()*367)+d.getDay();
return b;
}
public static void main (String[] args){
d = new Date(9, "June", 8);
System.out.println(getGregorianDateNumber());
System.out.println(getISO8601Date());
System.out.println(leapYear());
}
}
答案 0 :(得分:2)
而不是静态方法和静态字段d
使它们都是非静态的。
public class Gregorian {
private final Date d;
public Gregorian(Date d_) {
this.d = d_;
}
public boolean isLeapyear() {
... // implemented as above
}
... // Other methods as above, but all non-static.
}
主要如下:
public static void main (String[] args){
Date d = new Date(9, "June", 8);
Gregorian g = new Gregorian(d);
System.out.println(g.getGregorianDateNumber());
System.out.println(g.getISO8601Date());
System.out.println(g.leapYear());
}
答案 1 :(得分:1)
字符串默认是不可变的。
private int day;// needs to be immutable?
private int year;// needs to
不是您定义的不可变字段。他们的状态可以改变。让他们最终。
注意:进行最终引用并不意味着无法更改对象状态(在您的情况下,此注释无关紧要,因为您没有引用对象)。
答案 2 :(得分:1)
我同意thinksteep - 在你的字段中添加“final”将有助于防止它们被更改。没有制定者加强了这一点。
此外,我想指出
private String month;// needs to be immutable?
可以创建为任何内容,从“January”到“Pie”。如果我建议,请将其更改为枚举并确定允许的数月值。
public enum MonthName {
JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC;
}
将您的日期类更改为以下内容:
private final int day;
private final MonthName month;
private final int year;
public Date(int theDay, MonthName theMonth, int theYear) {
this.day = theDay;
this.month = theMonth;
this.year = theYear;
}
答案 3 :(得分:1)
day
和year
都是基元,并且已有int
的不可变版本,Integer
可以使用它。
第二件事是,在Date
中对Gregorian
进行静态引用,将Date
作为参数传递给每个static
方法。您可以确保线程安全。