声明一个全局变量,或在每个类中声明多次

时间:2012-09-26 16:55:33

标签: java android class variables

简单的问题。回顾我的代码,我注意到我在我的类或方法中多次声明了很多变量...例如:

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

从性能/内存使用的角度来看,这会更好吗?有什么理由不这样做吗?对我来说,似乎多次声明它们会消耗更多的内存,而不是一次最终的声明....但我不知道编译器是如何进行优化的。

5 个答案:

答案 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文件中,以便您可以按国家/地区/语言改变日期格式。