常量实用程序类中的最终关键字

时间:2011-05-26 05:39:31

标签: java performance class constants final

在使用具有常量实用程序类的final关键字时,我们可以获得性能和/或任何其他好处的任何差异。 [此类仅包含静态最终字段和私有构造函数以避免对象创建]

public class ActionConstants {
    private ActionConstants()  // Prevents instantiation
    {   }

    public static final String VALIDFIRSTLASTNAME = "[A-Za-z0-9.\\s]+";    
    public static final String VALIDPHONENUMBER = "\\d{10}";
    ...
    ...
}

只有差异才是最终的等级

 public final class ActionConstants {
    private ActionConstants()  // Prevents instantiation
    {   }

    public static final String VALIDFIRSTLASTNAME = "[A-Za-z0-9.\\s]+";    
    public static final String VALIDPHONENUMBER = "\\d{10}";
    ...
    ...
}

我想知道,使用final有什么好处,以及为常量定义类的正确方法是什么。

5 个答案:

答案 0 :(得分:5)

没有任何好处。它不会改变您static final属性的任何内容。

当一个类成为最终类时,编译器可以利用它来实现可覆盖的方法(静态方法不能被覆盖,充其量,它们在继承的类中隐藏它们)。

由于类是final,编译器知道它的方法都不能被覆盖。因此,它可以计算不需要生成多态代码的情况(即,代码在运行时根据对象实例找到覆盖方法的正确'版本')。因此,可以进行优化。

如果你想让一个真正独特的课程,你可以使用这样的东西:

public enum ActionConstants {

    INSTANCE;

    public static final int cte1 = 33;
    public static final int cte2 = 34;

}

如果你根本不对类实例感兴趣,只需将所有常量放在一个接口中。

答案 1 :(得分:3)

如果您正在寻求提高性能,最好预先编译您的模式,例如

public static final Pattern VALIDFIRSTLASTNAME = Pattern.compile("[A-Za-z0-9.\\s]+");    
public static final Pattern VALIDPHONENUMBER = Pattern.compile("\\d{10}");

与使用正则表达式的成本相比,使用final或者非常小。

答案 2 :(得分:1)

没有真正的好处,但它确实强化了你的期望,没有什么能扩展你的课程。从长远来看,这可能会使您更容易搜索代码以获取常量的所有用法,因为它们将保证为XXX.abc而不是YYY.abc,其中YYY延伸为XXX。

答案 3 :(得分:1)

您应该避免使用“常量类”。这意味着糟糕的设计。将常量放在与它们一起运行的类中。避免使用公共常量。它应该是例外,而不是正常的做法。

答案 4 :(得分:0)

使用常量类是不常见的。在大多数情况下,使用接口。这可以通过ActionConstants.VALIDFIRSTLASTNAME访问:

public interface ActionConstants {
  static final String VALIDFIRSTLASTNAME = "[A-Za-z0-9.\\s]+";    
  static final String VALIDPHONENUMBER = "\\d{10}";
  ...
}

从Java 5开始,您也可以使用枚举。枚举可以具有成员或扩展功能。

第二个例子使用一个简单的成员(如果你有不同的常量类型,这里有一个通用的方法,否则你也可以使用String成员):

public enum ActionConstants {

  FIRSTLASTNAME("[A-Za-z0-9.\\s]+"),
  PHONENUMBER("\\d{10}");

  private final Object value;

  private ActionConstants(Object value) {
    this.value= value;
  }

  @SuppressWarnings("unchecked")
  public <T> T getValue() {
    return (T)value;
  }

}

String value = ActionConstants.FIRSTLASTNAME.getValue();

当所有常量属于同一类型时,最后一个示例使用扩展功能。 您可以像ActionConstants.PHONENUMBER.isValid("0800123456")

一样使用它
public enum ActionConstants {

  FIRSTLASTNAME("[A-Za-z0-9.\\s]+"),
  PHONENUMBER("\\d{10}");

  private final Pattern pattern;

  private ActionConstants(String pattern) {
    this.pattern = Pattern.compile(pattern);
  }

  public void isValid(String value) {
    return pattern.matcher(value).matches();
  }

}

两个版本都允许使用静态导入。