gpt4 book ai didi

java - 访问实用程序类中静态最终数组中的资源

转载 作者:行者123 更新时间:2023-12-02 03:16:10 25 4
gpt4 key购买 nike

我有一个用于诊断的实用程序类(运行时信息、警告和错误事件),它定义了所有可能的诊断的代码、严重性级别和人类可读的消息。还有一个 DiagHolder,它保存从数组中选择的诊断信息以及该数据的访问器。

我正在重构 Java 中的硬编码字符串,以便使用 R.string 来本地化描述诊断的文本。

    public class Diagnostic {

// Debugging
private static final boolean D = true; // debugging?
private static final String TAG = "Diagnostic";
static Context mContext;
DiagHolder mDiagHolder;
String mTimestamp;


public enum DIAG_TYPE{
INFO,
WARNING,
ERROR
}

public enum DIAG_CODE {
SYSTEM_ONLINE,
SELF_TEST_COMPLETE,
GPS_SYNCH,
BATTERY_50,
BATTERY_25,
UNEXPECTED_RESET,
UNKNOWN_ERROR
}

static final DiagHolder[] Diags = {

//new DiagHolder("System powered up.", DIAG_CODE.SYSTEM_ONLINE, DIAG_TYPE.INFO),
new DiagHolder(mContext.getResources().getString(R.string.SYSTEM_ONLINE), DIAG_CODE.SYSTEM_ONLINE, DIAG_TYPE.INFO),
new DiagHolder("Self test complete. No issues.", DIAG_CODE.SELF_TEST_COMPLETE, DIAG_TYPE.INFO),
new DiagHolder("GPS synchronized.", DIAG_CODE.GPS_SYNCH, DIAG_TYPE.INFO),
new DiagHolder("Battery less than 50 percent.", DIAG_CODE.BATTERY_50, DIAG_TYPE.WARNING),
new DiagHolder("Battery less than 25 percent.", DIAG_CODE.BATTERY_25, DIAG_TYPE.WARNING),
new DiagHolder("Unexpected reset occured.", DIAG_CODE.UNEXPECTED_RESET, DIAG_TYPE.ERROR),
new DiagHolder("Unknown error.", DIAG_CODE.UNKNOWN_ERROR, DIAG_TYPE.ERROR),
};

public static class DiagHolder {
private String mmDescription;
private DIAG_CODE mmCode;
private DIAG_TYPE mmType;

DiagHolder(String description, DIAG_CODE code, DIAG_TYPE type)
{
this.mmDescription = description;
this.mmCode = code;
this.mmType = type;
}
}


Diagnostic(DIAG_CODE code, String timestamp, Context context) {
if (code.ordinal() >= 0 && code.ordinal() < Diags.length) {
this.mDiagHolder = Diags[code.ordinal()];
this.mTimestamp = timestamp;
this.mContext = context;
}
else {
this.mDiagHolder = new DiagHolder("Invalid diagnostic.", DIAG_CODE.UNKNOWN_ERROR, DIAG_TYPE.ERROR);
}

}

public String getDescription()
{
return this.mDiagHolder.mmDescription;
}

public DIAG_CODE getCode()
{
return this.mDiagHolder.mmCode;
}

public DIAG_TYPE getType()
{
return this.mDiagHolder.mmType;
}

public String getmTimestamp()
{
return mTimestamp;
}
}

正如您在上面看到的,我已经注释掉了表中的第一个诊断,并将其替换为访问 R.string 的行。我通过从 Activity 将上下文传递给 Diagnostic 来访问 R。但是,这不起作用,因为它会在 getResources() 调用上生成 NPE。

下面是来自 Activity 的调用。我添加了一个用于显示的虚拟诊断:

public class ViewDiagnosticsActivity extends AppCompatActivity {
...
private void buildDiagnosticList()
{
Diagnostic p = new Diagnostic(Diagnostic.DIAG_CODE.SYSTEM_ONLINE, "26OCT16 1439:10.76", this.getApplicationContext());
diagnostics.add(p);
}

}

是否有更好的模式来做到这一点?

最佳答案

由于 Diags 是一个静态字段,因此它将在 DiagHolder 类加载后立即初始化。此时,context 可能尚未初始化,假设类在上下文设置之前就已加载。因此,在静态初始化中使用上下文是危险的。

在这种情况下,在 DiagHolder 类中,您可以创建一个类似的方法

public static void init(Context context);

并初始化其中的Diags字段。

关于java - 访问实用程序类中静态最终数组中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40264659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com