直接实现具有最终字段或访问字段的接口?

时间:2010-12-17 13:30:25

标签: java performance blackberry java-me

是否有任何优势:没有类implement接口,而是直接使用最终字段?例如:

public interface MyInterface {
    int CONST_A = 16;
    int CONST_B = 45;
}

方法1:

public class MyClass implements MyInterface {

    MyClass() {
        System.out.println("A = " + CONST_A);
        System.out.println("B = " + CONST_B);
    }

}

方法2:

public class MyClass {

    MyClass() {
        System.out.println("A = " + MyInterface.CONST_A);
        System.out.println("B = " + MyInterface.CONST_B);
    }

}

我想知道上述任何一种方法是否具有任何一种优势。这种情况发生的地方之一是在Blackberry中,您将本地化文本定义为具有字符串键的接口,您需要使用键作为代码的各个部分中的参数来调用系统API。

4 个答案:

答案 0 :(得分:4)

将常量放在接口中并实现这些接口来访问常量被认为是一种不好的做法。原因是,许多类可以实现接口,从而为相同的常量提供了许多访问点。

所以,为了回答你的问题,我宁愿使用第二种解决方案。更好的是,我将常量放在最后一个类中,因此只有一个访问常量的点。它会更清晰,并且更容易重构。

答案 1 :(得分:3)

对常量使用枚举(Effective Java)

例如,定义相似并调用KernelError.KE_UNDEFINED_CALLER

public enum KernelError {
    KE_NO_ERROR(0), KE_UNDEFINED_SESSION(1), KE_UNDEFINED_CALLER(2), KE_SESSION_EXPIRED(
            3), KE_NULL_VALUE_IN_SESSION(4), KE_N0_SUCH_METHOD(5);

    private KernelError(int errorCode) {
        setErrorCode(errorCode);

    }

    private int errorCode;

    /**
     * @return the errorCode
     */
    public int getErrorCode() {
        return errorCode;
    }

    /**
     * @param errorCode
     *            the errorCode to set
     */
    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

}

答案 2 :(得分:1)

如果您在接口中定义了常量,例如,定义具有常量MyInterface2的{​​{1}},则它们会发生冲突。我个人认为方法2更容易阅读。

答案 3 :(得分:1)

我更喜欢方法2,因为它不会使用所有可能的常量污染using类的命名空间。这减少了代码完成选择的数量。此外,在查看常量的使用时,限定名称明显表明它是常量,并且定义了该常量。

也就是说,我更喜欢

interface Constants {
    static int A;
    static int B;
}

void foo() {
    System.out.println(Constants.A);
}

interface Constants {
    static int Const_A;
    static int Const_B;
}

void foo() {
    System.out.println(Const_A);
}