我在代码中使用帮助器类。例如,displayHelper(打开屏幕),resourceHelper(获取文本资源)等。我不希望每次都实例化一个实例。为此,我创建了一个每个类都将扩展的公共对象
public class CommonObject {
protected PropertiesManager properties = new PropertiesManager();
protected DisplayHelper displayHelper = new DisplayHelper();
}
一个班级会这样做
public class AbcController extends CommonObject
在那个班级我可以使用
displayHelper.openScreen(new AbcScreen());
这似乎有效,虽然我不认为这是最好的方法。此外,我不能将此公共对象用于扩展其他类的类。
跨类共享公共代码的最佳做法是什么?
PS:我不喜欢使用静态或单例,因为产生的问题妨碍了正确的单元测试。不想使用单身人士,因为它拥有状态。解决方案必须适用于Java 1.3,因为我的代码主要用于黑莓
答案 0 :(得分:2)
使用static
- 方法。例如:
class RandomHelper {
public static void doSomethingUseful() {
//Do something
}
}
通过这种方式,您可以从班级可见的所有地方拨打RandomHelper.doSomethingUseful()
。
答案 1 :(得分:2)
我知道我已经在我的评论中说了这句话,但是这里有。
你不需要单身人士。您不需要静态方法。您不需要依赖注入框架。
没有必要避免多次实例化一个类,特别是如果它没有任何字段。您正在寻找的“最佳实践”是,每个需要其中一个帮助程序的类都应该有一个类型为适当帮助程序的字段。
在构造函数中或静态初始化中实例化这些字段。还为每个人提供一个setter。换句话说,你可能有这个。
public class someClass {
private MyHelper myHelper = new MyHelper();
void setMyHelper(MyHelper myHelper){
this.myHelper = myHelper;
}
// ...
}
然后,如果你想模拟帮助器,你可以使用setter在测试时将mock注入到类中。
没有理由不这样做。我想这是一种“滚动你自己”的依赖注入。但如果您不想使用Spring的开销,这可能很有用。
答案 2 :(得分:2)
首先,如果您正在为Blackberry开发,那么您的单元测试功能已经受到阻碍。
现在回答你的问题。
您显然需要从该类中提取这些实例并将它们放在其他位置。
不喜欢静态变量?好吧。
不喜欢单身人士?确定。
然后声明一个常规实例变量并将其放在一个中心位置(比如主Application
类或类似的上下文。
答案 3 :(得分:0)
曾尝试使用静态方法吗?
类似的东西:
public class DisplayHelper{
public static void setUpDisplay(){
...
}
}
对这些方法的调用是DisplayHelper.setUpDisplay()
答案 4 :(得分:0)
单件。
public class DisplayHelper
{
private static volatile DisplayHelper instance = null;
public static DisplayHelper getInstance()
{
if (instance == null)
{
synchronized (DisplayHelper.class)
{
if (instance == null)
{
instance = new DisplayHelper();
}
}
}
return instance;
}
}