在效用 class 或继承基础 activity 之间做出选择
Deciding between utility class or inherit from a base activity
这更多是针对 Android 的最佳实践/性能相关问题。(我知道这可能是一个普遍的讨论,但我希望考虑到 Android环境)。
假设我有一个方法(检查条件并将用户重定向到各种活动)。这个方法被很多 classes 使用。
我无法决定是否将此方法添加到实用程序 class 中,将其设为静态并从每个需要它的 activity 中调用它。
或
创建一个基础activity,在里面添加方法,需要使用这个方法的activity继承自基础activity。 (假设在这种特殊情况下我们可以接受单一继承)。
想法?
编辑
这些是我检查过的与此相关的相关 SO 帖子。无法根据这些做出决定
Utility classes are evil?
If a "Utilities" class is evil, where do I put my generic code?
也可以在需要时在构造函数中注入 class。当您使用这种方法时,您可以轻松地在接口后面模拟这个 class,并且可以使用模拟创建测试。
例如一些伪代码:
你的Utility
class:
public class Utility implements IUtility {
@Override
public void add() { ... }
@Override
public void remove() { ... }
}
您的 Utility
使用 class:
public class UtilityUsingClass {
private IUtility utility;
public UtilityUsingClass(IUtility utility) {
this.utility = utility;
}
public void myMethod() {
// Use Utility class
utility.add();
...
}
}
在测试中它看起来像这样:
@Test
public void testMyMethod() {
UtilityUsingClass testClass = new UtilityUsingClass(new UtilityMock());
testClass.myMethod();
// assert stuff
}
UtilityMock
:
public class UtilityMock implements IUtility {
@Override
public void add() { // Implements mock logic ... }
@Override
public void remove() { // Implements mock logic ... }
}
这更多是针对 Android 的最佳实践/性能相关问题。(我知道这可能是一个普遍的讨论,但我希望考虑到 Android环境)。
假设我有一个方法(检查条件并将用户重定向到各种活动)。这个方法被很多 classes 使用。
我无法决定是否将此方法添加到实用程序 class 中,将其设为静态并从每个需要它的 activity 中调用它。
或
创建一个基础activity,在里面添加方法,需要使用这个方法的activity继承自基础activity。 (假设在这种特殊情况下我们可以接受单一继承)。
想法?
编辑 这些是我检查过的与此相关的相关 SO 帖子。无法根据这些做出决定
Utility classes are evil?
If a "Utilities" class is evil, where do I put my generic code?
也可以在需要时在构造函数中注入 class。当您使用这种方法时,您可以轻松地在接口后面模拟这个 class,并且可以使用模拟创建测试。
例如一些伪代码:
你的Utility
class:
public class Utility implements IUtility {
@Override
public void add() { ... }
@Override
public void remove() { ... }
}
您的 Utility
使用 class:
public class UtilityUsingClass {
private IUtility utility;
public UtilityUsingClass(IUtility utility) {
this.utility = utility;
}
public void myMethod() {
// Use Utility class
utility.add();
...
}
}
在测试中它看起来像这样:
@Test
public void testMyMethod() {
UtilityUsingClass testClass = new UtilityUsingClass(new UtilityMock());
testClass.myMethod();
// assert stuff
}
UtilityMock
:
public class UtilityMock implements IUtility {
@Override
public void add() { // Implements mock logic ... }
@Override
public void remove() { // Implements mock logic ... }
}