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

| 在将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有什么好处,定义常量类的正确方法是什么?     
已邀请:
没有好处。它不会改变您的
static final
属性。 当一个类成为最终类时,编译器可以将其用于可覆盖的方法(静态方法不能被覆盖,充其量,它们会将那些隐藏在继承的类中)。 由于类是最终的,因此编译器知道无法重写其任何方法。因此,它可以计算不需要生成多态代码的情况(即,代码在运行时根据对象实例找到覆盖方法的正确“版本”)。因此,优化是可能的。 如果您想让一个班级真正独一无二,可以使用以下方法:
public enum ActionConstants {

    INSTANCE;

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

}
而且,如果您根本不对类实例感兴趣,只需将所有常量放入接口中即可。     
如果您希望获得更好的性能,则最好预先编译模式,例如
public static final Pattern VALIDFIRSTLASTNAME = Pattern.compile(\"[A-Za-z0-9.\\\\s]+\");    
public static final Pattern VALIDPHONENUMBER = Pattern.compile(\"\\\\d{10}\");
与使用正则表达式相比,使用final或不使用final的成本非常小。     
没有真正的好处,但这确实使您期望没有任何东西可以扩展您的课程。从长远来看,这可能会更容易,例如,在代码中搜索常量的所有用途,因为可以保证它们是XXX.abc,而不是YYY.abc,其中YYY扩展了XXX。     
您应该避免使用\“常量的类\”。这意味着不良的设计。将常量放在与其一起操作的类中。避免使用公共常量。应该是例外,不是正常的做法。     
将类用于常量并不常见。在大多数情况下,使用接口。
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();
当所有常量都属于同一类型时,最后一个示例使用扩展功能。 您可以像ѭ9use这样使用它:
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();
  }

}
两种版本均允许使用静态导入。     

要回复问题请先登录注册