gpt4 book ai didi

java - 在API中使用静态工厂方法

转载 作者:行者123 更新时间:2023-12-01 12:59:46 26 4
gpt4 key购买 nike

我正在编写一个小型库,它基本上是一个自定义 Activity :

package com.example.android.somelibrary;

public class CustomActivity extends Activity {

private static final String EXTRA_SOME_THING = "CustomActivity.EXTRA_SOMETHING";

public static Intent newIntent(Context context, int arg1) {
Intent intent = new Intent(context, CustomActivity.class);
intent.putExtra(EXTRA_SOME_THING arg1);
return intent;
}

//... other methods
}

我希望该库的用户能够扩展此 Activity :

package com.example.android.myproject;

public class MyCustomActivity extends CustomActivity {
//... some methods
}

但我希望用户能够依赖我的公共(public)工厂newInstance():

// start MyCustomActivity
int someInt = 0;
Intent intent = MyCustomActivity.newIntent(getApplicationContext(), someInt);
startActivity(intent);

但是,当我尝试以这种方式启动 Activity 时,出现错误:

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.android.myproject/com.example.android.somelibrary.CustomActivity}; have you declared this activity in your AndroidManifest.xml?

我在各自的 list 中声明了这两个 Activity :CustomActivity 在 SomeLibrary 的 list 中,MyCustomActivity 在 MyProject 的 list 中。

我很困惑,因为如果我更改启动 Activity 调用,一切都会正常:

Intent intent = new Intent(context, MyCustomActivity.class);
startActivity(intent);

这让我认为我已经在 MyProject 中正确设置了所有模块依赖项。这只是Java的限制吗?我可以不以这种方式调用静态方法(在子对象上调用父方法)吗?

最佳答案

这行不通。

CustomActivity.newIntent() 是在 CustomActivity 类上定义的静态方法。该静态方法返回一个指向 CustomActivity.class 的 Intent。

那么当你调用 MyCustomActivity.newIntent() 时,你会得到什么?指向 CustomActivity.class 的 Intent 。因为这就是 CustomActivity 中定义的方法的作用。触发该 Intent 将不起作用,因为 CustomActivity 未在您的应用程序 list 中定义。无论如何,这并不重要,因为您想要启动 MyCustomActivity,而不是 CustomActivity。

您想要的是一个“知道”调用它的类名的静态方法。不幸的是,这在 Java 中是不可能的。

现在,话虽如此......我将向您展示如何做到这一点。不过我不推荐它。 (稍后我会说为什么)

无论如何,就像我说的:静态方法不知道它们是在哪个类上调用的。不过,实例方法可以。所以你可以这样做:

public class CustomActivity extends Activity {

private static final String EXTRA_SOME_THING = "CustomActivity.EXTRA_SOMETHING";

public Intent newIntent(Context context, int arg1) {
Intent intent = new Intent(context, getClass());
intent.putExtra(EXTRA_SOME_THING arg1);
return intent;
}

//... other methods
}

同样的事情,但是:

  • 这是一个实例方法,而不是静态
  • 我们不说 CustomActivity.class(它始终指向 CustomActivity 类),而是说 getClass()(动态返回当前实例的类)

然后,如果我们使用 MyCustomActivity 扩展 CustomActivity,我们可以创建一个 MyCustomActivity Intent ,如下所示:

Intent i = new MyCustomActivity().newIntent(getActivity(), 1);

它会起作用的。

为什么我不推荐这个:

  • 这又丑又奇怪。如果你想做某事而语言让它变得丑陋和粗俗,hansolov(“让语言获胜”);
  • 它所支持的技术并不是一个好主意。

让我继续讨论一下。继承与注塑塑料不太一样:我们看到这种技术被用来制造我们每天依赖的工具,但如果我们在家里这样做,我们可能会弄得一团糟。

那是因为继承比看起来更难。如果三个 Activity 都需要使用特定类型的一个参数,这是否意味着它们都应该是同一类型的 Activity ?可能不会。我没有空间或时间来了解它(其他人已经说得比我更好),但足以说明以这种方式共享代码有很多陷阱。

这是否意味着他们可以通过其他方式共享一些代码?当然!将实现放在另一个类中,并在您自己的静态 newIntent() 方法中调用。虽然代码多了一点,但没有这个陷阱。所以我建议这样做。

关于java - 在API中使用静态工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23595921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com