Java 使用静态属性在应用程序中移动数据可以吗?

Java 使用静态属性在应用程序中移动数据可以吗?,java,android,variables,properties,static,Java,Android,Variables,Properties,Static,我需要在应用程序的不同活动中访问一些自定义对象。为此,为了便于访问,我一直在使用静态属性将数据从一个活动移动到另一个活动。 例如,我有以下课程: public class TrackItem { public String title, imageUrl, mediaUrl, type, artist, desc; public static TrackItem track; } 以及开始一项活动: TrackItem.track = items.get(i); // 'ite

我需要在应用程序的不同活动中访问一些自定义对象。为此,为了便于访问,我一直在使用静态属性将数据从一个活动移动到另一个活动。
例如,我有以下课程:

public class TrackItem {
    public String title, imageUrl, mediaUrl, type, artist, desc;
    public static TrackItem track;
}
以及开始一项活动:

TrackItem.track = items.get(i); // 'items' is an arraylist defined elsewhere
Intent trackActivity = new Intent(c, TrackActivity.class);
startActivity(trackActivity);
现在在
TrackActivity
中,我可以轻松访问
TrackItem.track
并使用它的属性。

我只是想知道我是否犯了错误?有没有更好的方法可以做到这一点?

我想说,在某些情况下这是可以的,但可能还有其他更合适的解决方案

您可以有一个中央数据存储类,它使用单例原则,因此可以从任何地方访问。对于新的
活动
,您需要将项目id添加到
意图
。然后,使用id,您可以从数据存储中获取该项

您还可以使项目可序列化,只需将其添加到
Intent


使用静态成员时需要记住的一点是,它可能导致内存泄漏。静态成员与类相关,因此只有当您将其设置为null,或者整个应用程序被终止,并且类加载器卸载此特定类时,才会对其进行垃圾收集。

android处理此问题的方法是使您的类

Parcelable
并将其从一个活动传递到另一个活动

如果您正在初始化活动中的静态变量,请注意丢失数据,因为在android中,活动状态更改为暂停后,随时都可能被销毁。此外,如果整个应用程序被系统杀死,那么静态变量可能会被擦除,这一情况相当频繁。然后你会得到

NullPointerException
正在尝试访问您的数据

如果确实要使用静态成员,请在

Application
类构造函数,因此它们将在应用程序启动时重新创建,并被终止


但一般来说,这在android中不是一个好的做法。

一般来说,这是一个不安全的做法,因为很难跟踪谁在操纵其数据。对于簿记信息,使用静态变量要安全得多,例如可以用来查找适当的TrackItem(例如,在SQLite数据库中)的ID,它是它自己的对象,并且在不应该的时候没有机会编辑它。它是OOP的一个术语,使用静态变量作为共享数据打破了封装

如果您希望在应用程序周围发送数据,那么最好是像其他人所说的那样,通过意向发送数据,或者通过共享引用发送数据。两者都有一个优点,即在任何给定的时间,您只处理对象的一个实例。SharedReference还有一个额外的优点,即在应用程序被终止后保留数据,以便用户可以使用关闭应用程序时播放的相同曲目继续播放。这两种模式都比使用静态成员作为共享数据字段更安全。

一种“单例模式”可能更好,因为它可以让您更好地控制访问——避免使用公共静态变量的一个原因是,它们可以在应用程序中的任何时间、任何位置分配。但我认为您需要其中之一,因为除了在
Intent\putExtra
中少量传递数据之外,没有其他好方法可以在活动之间传递数据。