我认为我的代码中出现了问题,以静态方式或非静态方式调用(setIstance
)方法isSameMonth()
是否相同?
编译器建议我将timesheet.isSameMonth()
更改为Timesheet.isSameMonth()
我认为不是,因为我想传递本地变量timesheet
,它是相同的还是应该修改我的代码?
时间表类:
static private Timesheet timesheet;
static public Timesheet getIstance()
{
if (timesheet == null || !Timesheet.isSameMonth())
{
timesheet = null;
timesheet = new Timesheet();
}
return timesheet;
}
static public void setIstance(Timesheet timesheet)
{
if (timesheet != null && timesheet.isSameMonth())
{
Timesheet.timesheet = timesheet;
}
}
public static boolean isSameMonth()
{
Date now = new Date();
Calendar calendarNow = Calendar.getInstance();
calendarNow.setTime( now );
Date firstDay = timesheet.days[0];
Calendar calendarFirstDay = Calendar.getInstance();
calendarFirstDay.setTime( firstDay );
if (calendarNow.get(Calendar.MONTH) == calendarFirstDay.get(Calendar.MONTH))
{
return true;
}
return false;
}
我从外面打电话:
Gson gson = new Gson();
String json = sharedPrefs.getString("timesheet", "");
if (!json.isEmpty())
{
try
{
Timesheet timesheet = Timesheet.getIstance();
if (timesheet.getDay(0)==null)
{
Timesheet.setIstance( gson.fromJson(json, Timesheet.class) );
}
refreshWidget(timesheet, context, allWidgetIds, intent.getAction());
}
catch (Exception e)
{
Log.e(TAG_LOG, e.toString());
}
}
答案 0 :(得分:2)
它可以工作,但惯例是通过类名引用静态方法:
Timesheet.isSameMonth()
这使得读取您的代码的人明白您正在调用静态方法。
答案 1 :(得分:1)
没有。除了调用样式Timesheet.isSameMonth()
的方法之外,无需更改代码。
由于这是一个静态方法,因此方便调用方法的方式是使用类名而不是实例变量。
否则,阅读代码的人可能会认为它是一种实例方法。这就是为什么IDE建议让每个人都轻松生活。
答案 2 :(得分:1)
timesheet
不是局部变量,它是类的静态字段。并且您的IDE建议您将timesheet.isSameMonth()
更改为Timesheet.isSameMonth()
,因为该方法是静态的,最好以(静态)方式访问它。
如果timesheet
不是静态的,那么你就会得到另一个编译错误,说静态isSameMonth()
无法访问非静态变量。
访问静态方法有两种方式:通过类名和实例引用,但将生成相同的代码。即使引用为null
:
Runtime r = null;
r.getRuntime(); // This works even though r is null
答案 3 :(得分:1)
您提出这个问题应该让您考虑设计。如果每个用法都与保留的实例相关联,我认为isSameMonth不应该是一个静态方法。
不严格地回答主题中的问题,但显然有帮助