我们可以使用Private Constructor创建多个实例吗?

时间:2019-04-03 11:35:10

标签: c# private-constructor

我们都知道我们无法创建具有私有构造函数的类的对象。因此出现的问题是可以创建多少个此类实例。请在下面找到示例代码。

//schedule recurring task only once
//Fragment
    if(!SessionManager.getBoolenFromPreferences(getActivity(),REFRESH_ATTENDANCE)){
        attendanceViewModel.setupPeriodicRefreshWork();
        SessionManager.putBoolenInPreferences(getActivity(), true, REFRESH_ATTENDANCE);
    }

//view model
public void setupPeriodicRefreshWork() {
    AttendanceScheduler.refreshWork();
}

//Scheduler
public static void refreshWork() {

    //define constraints
    Constraints myConstraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

  //How to Set Data Here ?
    Data source = new Data.Builder()
            .put(HERE)
            .build();

    PeriodicWorkRequest refreshWork =
            new PeriodicWorkRequest.Builder(AttendanceWorker.class, 1, TimeUnit.HOURS)
                    .setConstraints(myConstraints)
                    .setInputData(source)
                    .build();

    WorkManager.getInstance().enqueue(refreshWork);
}

按照我所知道的,它应该创建2个类的对象。需要帮助来了解这一点。

4 个答案:

答案 0 :(得分:4)

  

我们都知道我们无法创建具有私有构造函数的类的对象。

嗯,那是不准确的。您可以通过使用该类的静态成员来创建仅具有私有构造函数的类的对象(实例),就像问题代码中一样。
您不能做的是在代码中的任何其他位置创建该类的实例。

  

可以创建多少个此类的实例

在您的代码示例中,有两个类Test的实例。

我认为您可能会感到困惑的是,您希望第二个Console.WriteLine打印30,但它打印了20。这是因为public int val ;是实例成员。如果它是静态成员,那么它将打印30

答案 1 :(得分:1)

也许您正在寻找这样的东西:

public static Test Callme(int GetVal)
{
    Test obj = new Test(GetVal);
    Console.WriteLine(obj.val);
    return obj;
}

然后创建新的实例,例如:

Test test1 = Test.Callme(10);
Test test2 = Test.Callme(20);

这样,您可以轻松访问每个实例的成员。例如。 test1.val

答案 2 :(得分:0)

Callme方法是静态方法。静态方法不需要调用对象实例。他们没有this(关键字)引用,可以在类上直接调用。根据您的情况Test.CallMe(someValue)。请注意,这里没有对象实例。 如果CallMe不是静态方法,则需要一个实例/对象来调用它。例如

Test ob = new Test();
ob.CallMe(someValue);

您的示例说明的是私有字段/方法的使用。 当使用私有关键字标记类似构造函数或字段的方法时,只能从声明类中调用/访问该方法/字段。

这意味着CallMe可以访问构造函数,因为CallMe是该类的成员,而构造函数是该类的成员,因此它们可以彼此访问。

当一个类只有一个构造函数并且该构造函数是私有的时,它实际上意味着只能从该类内部创建该类的实例。

因此,在当前示例中,CallMe会在每次调用该类时创建一个该类的实例。 如果您两次调用CallMe,则将创建该类的2个实例。

答案 3 :(得分:0)

由于Callme方法是静态的,因此它在使用前由系统实例化,然后保留在内存中供以后调用。无论创建了多少个该类实例,该类的静态成员仅创建一个副本。