2

我有一个静态引用变量

static IMail mailer = null;

我在 SearchManager 类的构造函数中为其赋值

public SearchManager(ILog logger, String basePath, String indexPath, String nwId, IMail mailer) {
        this.logger = logger;
        this.basePath = basePath;
        this.indexPath = indexPath;
        this.nwId = nwId;
        this.mailer = mailer;
    } 

我在我的代码中使用邮件程序。此类的构造函数可能会被多次调用。所以我有一个查询,每次调用构造函数时这个静态引用变量将如何表现。它会只取我第一次调用构造函数时传递的值,还是每次调用构造函数时都会取不同的值?

4

6 回答 6

5

首先,您不应该将 'this' 关键字与静态变量一起使用。您可以执行以下操作(虽然不推荐)

public SearchManager(ILog logger, String basePath, String indexPath, String nwId, IMail mailerarg) {
        this.logger = logger;
        this.basePath = basePath;
        this.indexPath = indexPath;
        this.nwId = nwId;
        mailer = mailerarg;
    } 

是的,它是一个静态变量,每次创建 Class 的新对象时都会发生变化。静态变量属于 Class 而不是它的单个实例。因此,无论何时更改它的值,它都会反映在所有相应的类对象中(所有对象都有它们的类信息)。

于 2013-07-24T11:13:43.270 回答
1

它会只取我第一次调用构造函数时传递的值,还是每次调用构造函数时都会取不同的值?

它将采用不同的值,因为它由实例共享,并且每个实例将看到相同的值。

根据JLS 8.3.1.1

如果一个字段被声明为静态的,那么无论最终创建多少个类的实例(可能为零),都只存在该字段的一个化身。静态字段,有时称为类变量,在类初始化时体现

于 2013-07-24T11:11:25.610 回答
1

它会只取我第一次调用构造函数时传递的值,还是每次调用构造函数时都会取不同的值?

每次调用构造函数时都会采用不同的值。

静态变量并不是特别特别。当您为变量赋值时,变量将采用该值。这同样适用于静态变量,所以如果你多次分配一个静态变量,它的值每次都会更新。


在这种情况下,如果您(可能)使用不同的参数多次调用构造函数,听起来很像这应该是一个特定于实例的字段,而不是单个静态变量。这样,每个SearchManager人都有一个对它mailer的构造的引用,而不是碰巧最近构造的经理的邮件。

即使您不同意这一点,并且认为mailer整个应用程序应该有一个单一的,我建议您更改它当前的管理方式。传递给构造函数的值往往用于实例。因此,在构造函数中设置静态变量可能会非常混乱,MailerSupport.setGlobalMailer(mailer)当您想更改值时,最好对类似的东西进行显式调用。

于 2013-07-24T11:12:14.460 回答
1

对象的所有实例共享静态数据。因此,所有 Insatnces(您对 SearchManager 构造函数的调用)都将共享邮件程序。

即,假设第一次调用 SearchManager 的邮件程序值为“X”,而另一次调用 SearchManager 将为邮件程序设置值“Y”,现在所有实例的邮件程序值为 Y。

于 2013-07-24T11:12:27.673 回答
0

您可以多次更改其值,但所有实例都将看到相同的值。

于 2013-07-24T11:11:53.067 回答
0

值可以随时更改,但所有实例都具有相同和最新的值。即上次调用

于 2013-07-24T11:14:43.887 回答