Java 跨类共享通用代码的最佳实践

Java 跨类共享通用代码的最佳实践,java,android,blackberry,Java,Android,Blackberry,我在代码中使用助手类。例如,displayHelper(打开屏幕)、resourceHelper(获取文本资源)等等。我不希望每次都实例化一个实例。为此,我创建了一个公共对象,每个类都将扩展它 public class CommonObject { protected PropertiesManager properties = new PropertiesManager(); protected DisplayHelper displayHelper = new Disp

我在代码中使用助手类。例如,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:我不喜欢使用静态测试或单例测试,因为这样会产生一些问题,妨碍正确的单元测试。不想使用单例,因为它保持状态


该解决方案必须适用于Java1.3,因为I代码主要用于blackberry

使用
静态
-方法。例如:

class RandomHelper {
    public static void doSomethingUseful() {
        //Do something
    }
}

通过这种方式,您可以从类可见的任何地方调用
RandomHelper.doSomethingUser()

是否尝试过使用静态方法

比如:

public class DisplayHelper{
    public static void setUpDisplay(){
        ...
    }
}
对这些方法的调用是
DisplayHelper.setUpDisplay()
Singleton

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;
    }
}

我知道我已经在我的评论中说过了,但现在开始

你不需要单身。您不需要静态方法。您不需要依赖项注入框架

没有必要避免多次实例化一个类,尤其是当它没有任何字段时。您正在寻找的“最佳实践”是,每个需要一个helper的类都应该有一个字段,其类型是适当的helper

在构造函数或静态初始化中实例化这些字段。还为每个设置器提供一个设置器。换句话说,你可能有这个

public class someClass {
    private MyHelper myHelper = new MyHelper();

    void setMyHelper(MyHelper myHelper){
        this.myHelper = myHelper;
    }

    // ...
}
然后,如果要模拟助手,可以在测试类时使用setter将模拟注入类中


没有理由不这样做。我想这是一种“自己动手”的依赖注入。但是如果你不想有使用Spring的开销,这是很有用的。

首先,如果你是为Blackberry开发的,那么你的单元测试能力已经受到了阻碍

现在谈谈你的问题

显然,您需要从该类中提取这些实例并将它们放在其他地方

不喜欢静态变量?好的。
你不喜欢单身吗?好的。


然后声明一个常规实例变量并将其放在中心位置(例如主
应用程序
类或类似的上下文。

…因此造成了一场可测试性噩梦。请参阅。因此,这根本不是最佳实践。@DavidWallace关于设计角度,这正是静态方法的用途。别误会,我完全看到了单元测试的问题(例如,非单元测试),但我认为这是单元测试概念的问题。它不是关于静态方法本身的单元测试,而是关于使用它们的单元测试代码。妨碍可测试性的设计是一个糟糕的设计。如果你没有可测试性,你就没有可维护性,这意味着你的设计被冻结了。@DavidWallace我想讨论一下更多,但我认为我们有点垃圾评论,讨论的主题不够,OP已经决定静态对他的项目不好,因为单元测试,所以我不认为它会改变关于这个问题的东西,这个问题要求一个最佳实践。使用单例类并在整个应用程序中使用为什么你不想要要每次实例化帮助器类吗?如果没有数据,那么有多个实例就没有开销。@DavidWallace我不想每次都实例化,因为实例化它的每个类都需要实现其他接口以及使用一些资源常量。我不想对每个c做同样的事情lass.我想用我现有的代码做一次,但我觉得这不是最好的做法。我认为黑莓开发可以用Java 1.4,而不是Java 1.3。Peter,Java 1.4支持Java me不支持的“断言”——Java 1.3是Java me设备支持的最高Java版本,比如BlackBerry和Nokia S40。由于这里列出的问题,我不想使用singleton。我认为每次使用它都是代码重复。如果我向构造函数添加一个参数,我将不得不在多个地方更改它。有很多方法可以避免它,但对我来说,它似乎是代码重复。而且,我不能使用静态导入,因为它是Java 1.3OK,但即使没有静态导入,也可以将常量保留在类中。引用它们时只需限定它们的名称。可以对常量和其他字段使用
static
,因为这实际上不会对可测试性产生影响。只需避免对方法使用
static
。不这样做有一些原因。如果0可以,则不提供方法1参数。无需放置类(帮助器)在
someClass
的公共接口中,当只在实现中引用它时就可以了。不需要为没有状态的对象调用构造函数。这是一个关于移动java的问题。
new
在移动中设置对象可能很重要,如果这种情况经常发生。您在上面链接的文章中尝试使用
Math.abs()
例如,它是有缺陷的。尝试编写单元测试代码以避免运行真正的
Math.abs()
是不必要的,实际上可能会导致问题。@Nate我不同意你的所有评论,但你指出了一个错误。如果setter仅用于测试,则无需将其公开。Package private可以。我已相应地编辑了我的答案。这是一个需要针头的剑的经典示例红色。也许你所说的对J2EE项目或API来说是合适的。然而,大多数黑莓应用程序都更小,更容易测试。静态方法不需要