简单的问题。回顾我的代码,我注意到我在我的类或方法中多次声明了很多变量...例如:
public Long dbInsertCheckin(final String Class) {
final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
...
}
和
public class SmashDataSource {
final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
final SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
final SimpleDateFormat timeFormat = new SimpleDateFormat("HHmm");
...
}
这让我想到,不是声明“dateformat”,“sdf”,或“timeformat”或我在多个地方使用的其他人,我在我的应用程序类中全局声明这些是不合理的,然后引用他们想要的地方
public class MyApp extends Application {
public final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public final SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
public final SimpleDateFormat timeFormat = new SimpleDateFormat("HHmm");
稍后在其他课程中引用它们:
MyApp.dateformat
Myapp.sdf
从性能/内存使用的角度来看,这会更好吗?有什么理由不这样做吗?对我来说,似乎多次声明它们会消耗更多的内存,而不是一次最终的声明....但我不知道编译器是如何进行优化的。
答案 0 :(得分:3)
使用全局变量没有任何问题。通常,它们可以避免保持灵活和封装。但是像Factory Pattern这样的设计模式与静态/全局类很相配。它还避免了代码重复。
(但是我可能会避免使用我的Application
类,因此我的全局字段仅在需要时使用,但这是一个实现细节。)
我可能会这样做。它保持灵活性,同时将事物放在一个地方,使它们在您的应用程序中保持一致。
public class MyGlobals
{
private static SimpleDateFormat dateFormat;
public static SimpleDateFormat getDateFormat()
{
if(dateFormat== null)
{
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
return dateFormat;
}
}
然后你可以在其他类中使用它:
MyGlobals.getDateFormat();
====
这里有关于它的开发文档的一些信息:
http://developer.android.com/guide/faq/framework.html#3
简而言之,用于共享复杂的非持久性用户定义对象 持续时间,建议采用以下方法:
单身人士课程
您可以利用您的应用程序组件这一事实 通过使用单身人士在同一过程中运行。这是一个 设计为只有一个实例的类。它有静电 返回实例的getInstance()等名称的方法; 第一次调用此方法时,它会创建全局实例。 因为所有调用者都获得相同的实例,所以他们可以将其用作 互动点。例如,活动A可以检索实例 并调用setValue(3);以后的活动B可以检索实例和 调用getValue()来检索最后一个设置值。
公共静态字段/方法
使活动/服务之间的数据可访问的另一种方法是 使用公共静态字段和/或方法。你可以访问这些 来自应用程序中任何其他类的静态字段。分享一个 对象,创建对象的活动设置静态字段 指向此对象以及要使用此对象的任何其他活动 object只访问这个静态字段。
WeakReferences to Objects的HashMap
您还可以使用WeakReferences的HashMap与Long对象 键。当一个活动想要将一个对象传递给另一个活动时,它就是 只需将对象放入地图并发送密钥(这是唯一的 基于计数器或时间戳的长期通过收件人活动 意图额外。收件人活动使用此检索对象 键。
持久对象
即使应用程序似乎继续运行,系统也可能 选择终止其进程并稍后重新启动它。如果你有数据 你需要从一个活动调用到下一个活动调用 将该数据表示为活动在其中保存的状态 被告知它可能会消失。
用于共享复杂的持久性用户定义对象,如下所示 建议使用方法:
Application Preferences Files contentProviders SQLite DB
如果共享数据需要保留在哪些点之间 可以杀死应用程序进程,然后将该数据置于持久性状态 存储,如应用程序首选项,SQLite数据库,文件或 ContentProviders。有关更多详细信息,请参阅数据存储 关于如何使用这些组件。
答案 1 :(得分:1)
是的,在一个地方定义这些内容是个好主意 - 不仅因为它更干净,而且因为在不经过整个代码库的情况下,更容易在全球范围内更改它们。就个人而言,我会选择这样的事情:
public static final LONG_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
但是,在这种特殊情况下,您需要小心,因为SimpleDateFormat
对象不是线程安全的。这意味着,如果要在整个应用程序中共享一个实例,则需要采取一些额外步骤来避免并发问题。有关详细信息,请参阅以下内容之一:
SimpleDateFormat thread safety
Proving that SimpleDateFormat is not threadsafe
“Java DateFormat is not threadsafe” what does this leads to?
答案 2 :(得分:1)
这一切都归结为您的需求和您当前的背景。
如果你能负担得起一些重构,恕我直言,最好的方法是创建一个包含所有这类变量的上下文类。您可以尝试重构会话,甚至将其他配置参数移动到该类,并将其作为Singleton:
public class MyApplicationContext {
//Constants and other global variables (I'd make the strings global, rather than
//The time formats in this case.
public final String TIME_FORMAT = "HHmm";
//Context variables (taken from your source of choice)
private String someConfigurationPath = "...";
//Getters & Setters
}
答案 3 :(得分:1)
全局变量可以作为代码气味的指标。
也许可以在不同的位置找到一个模式,使用相同的简单日期格式。这可以是重构代码并将所有公共部分移动到单个位置的机会,例如,组合成一个新方法(如printDate(aDate)),而不是SimpleDateFormat的多个实例,并进一步包含重复代码。
答案 4 :(得分:0)
我愿意,这一切都取决于会发生什么变化,但是如果你把所有配置变量都作为静态,你可以在一个地方更改日期格式,而其他所有变量都不需要更改。
有时对于日期格式之类的东西,最好将日期字符串放在stings.xml文件中,以便您可以按国家/地区/语言改变日期格式。