精华内容
下载资源
问答
  • java中只有static和非static变量,这个属于每个类的,如果需要全局变量比如PI(3.14...),可以写一个类Math,定义static变量PI,调用Math.PI就可以使用了,这样就达到我们使用全局变量的目的了
  • 初步整理的java常量变量的概念,十分粗浅,只是将简单的概念整理了出来,在使用过程还需要慢慢累积和理解其中的更深含义
  • Java常量接口反模式 这篇文章最初发布在我的博客上: : 您如何在Java中定义和使用常量? Internet上的大多数建议具有以下意见: 为类的常量声明public static final 不要将接口用于常量 定义常量的最常见方法...
  • java中interface中定义变量都是"public static final" 类型的, 也就是常量, 因此很多人在interface定义常用的常量(这也是本人偏爱的方式);  由此却引起了不少风波, 网上关于此问题的讨论也非常多, 下面说说我的...

    java中interface中定义变量都是"public static final" 类型的, 也就是常量, 因此很多人在interface定义常用的常量(这也是本人偏爱的方式); 

    由此却引起了不少风波, 网上关于此问题的讨论也非常多, 下面说说我的个人意见: 


    下面是功能等同的两种定义常量的方式: 

    package com.example;
    
    public final class Constants {
        private Constants() {}
        public static final int A = 100;
        public static final int B = 100;
        public static final int C = 100;
        public static final int D = 100;
    }


    package com.example;
    
    public interface Constants {
        int A = 100;
        int B = 100;
        int C = 100;
        int D = 100;
    }



    类定义常量和接口定义常量: 


    1. 类定义常量, 需要定义成final且定义一个private的构造方法, 这样做是为了不让其他类继承, 禁止实例化此类, 

    调用时直接以"类.常量"的方式调用. 


    2. 接口中定义的"变量", 其实就是常量, 接口中的"变量"默认都是 "public static final"类型, 即为常量, 

    因此接口可以省略"public static final"而直接写成 "type variable".


    3. 用如上的类定义常量, 不能实例化也不能被继承, 看起了完美无缺; 


    4. 接口定义常量, 虽不能实例化, 确可以被其他类实现;

    因此有这么一种设计模式"The constant interface pattern". 所谓的"常量接口模式",  就是其他类要使用接口中定义的常量, 

    就实现该接口. 我认为这是对接口的烂用. 接口中定义的常量应为所有类频繁使用的常量, 但并不是每个类都使用了接口中定义的所有常量, 

    因而导入了不必要的常量到这个类中, 并且导入后这个类的子类也会基础导入的常量, 这样会导致混乱, 应当避免此种用法.


    5. 在interface和class中定义相同的常量, interface生成的class文件比class生成的class文件会更小, 而且更简洁, 效率更高.




    总结: 

    1. 不要使用"常量接口模式", 此模式会导致类中的常量混乱, 增加维护难度.

    2. 不要使用静态导入, import static *****

    我非常不赞同这种使用常量的方法, 因为import static会导致可维护性下降, 维护的人看代码时, 不是那么清楚或者不那么迅速的知道这个常量位于哪个文件中. 

    建议使用常量的地方直接 "接口.常量名" 的方式使用

    3. 还有人说 用这种方式定义常量: public abstract class Constants {}, 很容易看出这种方式定义常量的目的: 禁止实例化. 

    但是"abstract class"的目的是为了让其他类继承, 因此语意别扭, 同样具有interface定义常量的确定 ----- 即可以被继承,  

    其实解决上述问题更优美的方式是用final修饰类并给类定义一个private构造方法. 

    4. 对于用是用interface定义常量还是使用class定义常量, 看个人喜好. 个人觉得interface定义常量更为优美, 

    1. 代码更简洁

    2. 生成的class文件更小, jvm不要考虑类的附加特性, 如方法重载等, 因而更为高效.  

    tips: 这是一种反模式的用法, 很多人不喜欢这种用法, 如果我们知道它的优缺点, 延长避短, 也是无可厚非的, 

            还有一点是不要把这种用法用成"常量接口模式", 个人觉得"常量接口模式"确实是一种对interface的"pool use".


    相关阅读

    http://my.oschina.net/gschen/blog/134794?fromerr=zKrZIUb5

    http://stackoverflow.com/questions/2659593/what-is-the-use-of-interface-constants

    http://www.ibm.com/developerworks/cn/java/l-java-interface/index.html

    展开全文
  • Java开发规范之常量定义

    千次阅读 2020-03-27 18:06:50
    之前的文章已经介绍过命名规范(点击Java开发规范之命名篇(上)和Java开发规范之命名篇(下)访问),本文将进一步介绍常量定义规范,虽然之前的文章有提到常量规范但也只是限于命名,本篇将讨论常量定义和使用过程...

    开发团队在开发过程中,由于每个人的开发习惯,以及对于技术的理解深浅程度不一,往往一个项目在开发过程中,代码的质量,代码的风格都不尽相似,所以有一份适合团队的代码规范是非常有必要的,而一个团队的代码规范,包含了开发常见的风格习惯以及一些常见代码细节的写法规范等。

    本系列文章将整合 阿里巴巴《Java开发手册》和 谷歌《Java编程规范》,总结Java开发过程的编码规范,并通过具体编码案例给出编码规范的原因,如果总结内容存在问题还望指出。


    目录

    1.禁止魔法值

    2.长整性类型赋值数值后使用大写L

    3.常量需要根据功能放置在不同常量类

    4.常量的复用层次

    5.固定范围的变量使用enum类型


    之前的文章已经介绍过命名规范(点击 Java开发规范之命名篇(上)和 Java开发规范之命名篇(下)访问),本文将进一步介绍常量定义规范,虽然之前的文章有提到常量规范但也只是限于命名,本篇将讨论常量定义和使用过程的具体细则,包括定义格式,如何归类和复用范围等。

    1.禁止魔法值

    【Alibaba】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

    【Google】未明确定义类似规范

    说明:魔法值是指带代码中直接使用的数值或者字符串,只有在这个数值记述的那部分代码中才能明确了解其含义,比如拼接字符串前缀。

    反例:

    补充:反例1和2出现了魔法值  “1”  和   “stop”,可以使用static final 定义常量或使用enum值

    2.长整性类型赋值数值后使用大写L

    【Alibaba】在long或者Long赋值时,数值后使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。

    【Google】未明确定义类似规范

    说明:小写的l无法区分写的是数字的1,还是Long型标识。

    反例:

    3.常量需要根据功能放置在不同常量类

    【Alibaba】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。

    【Google】未明确定义类似规范

    说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解和维护。

    正例:【Alibaba】缓存相关常量放在类CacheConsts下;系统配置相关常量放在类ConfigConsts下。

    反例:【Alibaba】日期格式常量和字符串常量放置在同一个常量类中。

    4.常量的复用层次

    【Alibaba】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。

    • 1) 跨应用共享常量:放置在二方库中,通常是client.jar中的constant目录下。
    • 2) 应用内共享常量:放置在一方库中,通常是子模块中的constant目录下。
    • 3) 子工程内部共享常量:即在当前子工程的constant目录下。
    • 4) 包内共享常量:即在当前包下单独的constant目录下。
    • 5) 类内共享常量:直接在类内部private static final定义。

    【Google】未明确定义类似规范

    反例:【Alibaba】针对上述条例 2,易懂变量也要统一定义成应用内共享常量,两位工程师在两个类中分别定义了“YES”的变量: 类A中:public static final String YES = "yes"; 类B中:public static final String YES = "y"; A.YES.equals(B.YES),预期是true,但实际返回为false,导致线上问题。

    5.固定范围的变量使用enum类型

    【Alibaba】如果变量值仅在一个固定范围内变化用enum类型来定义。

    【Google】未明确定义类似规范

    说明:如果存在名称之外的延伸属性应使用enum类型。

    正例:

     

     

     

    展开全文
  • Java中定义常量的几种方法

    千次阅读 2019-05-02 14:52:43
    Class定义常量方法(推荐方法) //final修饰符 public final class Constants { //私有构造方法 private Constants() {} public static final int ConstantA = 100; public static final int ConstantB = 100...

     

    Class定义常量方法(推荐方法)

    //final修饰符
    public final class Constants {
        //私有构造方法
        private Constants() {}
    
        public static final int ConstantA = 100;
        public static final int ConstantB = 100;
        ......
    }
    

    采用“类.常量名”方法进行调用。需要私有化构造方法,避免创建该类的实例。同时不需让其他类继承该类。

    如果多处需要访问工具类中定义的常量,可以通过静态导入(static import)机制,避免用类名来修饰常量名。

    Interface定义常量方法

    public interface Constants {
        int ConstantA = 100;
        int ConstantB = 100;
        ......
    }
    

    在interface中声明的字段,虚拟机在编译时自动加上public static final修饰符。使用方法一般是“接口.常量名”。也可以通过实现该接口,直接访问常量名,即常量接口模式。

    常量接口:即接口中不包含任何方法,只包含静态的final域,每个域都导出一个常量。使用这些常量的类实现这个接口,以避免用类名来修饰常量名。

    常量接口模式是对接口的不良使用。具体参考如下:

    The constant interface pattern is a poor use of interfaces. That a class uses some constants internally is an implementation detail. Implementing a constant interface causes this implementation detail to leak into the class's exported API. It is of no consequence to the users of a class that the class implements a constant interface. In fact, it may even confuse them. Worse, it represents a commitment: if in a future release the class is modified so that it no longer needs to use the constants, it still must implement the interface to ensure binary compatibility. If a nonfinal class implements a constant interface, all of its subclasses will have their namespaces polluted by the constants in the interface.

    There are several constant interfaces in the java platform libraries, such as java.io.ObjectStreamConstants. These interfaces should be regarded as anomalies and should not be emulated.

    区别

    上述两种方法对比,interface中定义常量方法生成的class文件比第一种方法的class文件更小, 且代码更简洁, 效率更高.

    但是在java中会产生问题,主要是java的动态性,java中一些字段的引用可以在运行期动态进行。某些场景下,部分内容改变可只进行部分编译。具体例子参考文档Java Interface 是常量存放的最佳地点吗?

    该文推荐使用Class定义常量,但采用private修饰符,通过get方法获取常量。这种方案可以保证java的动态性。

    public class A{
        private static final String name = "bright";
        public static String getName(){
            return name;
        }

     以上摘自:https://www.cnblogs.com/wanqieddy/p/9051568.html

    Interface不是存放常量的最佳地点,因为当程序运行时,当你修改Interface里面的常量值时,Java不能够动态扫描到改变的值,所以程序必须重新编译才能获得预想效果。

    详细参考:https://www.ibm.com/developerworks/cn/java/l-java-interface/index.html

    展开全文
  • 如何在Java中定义常量

    2019-12-04 11:50:30
    对于Java中常量这一主题,似乎存在许多混淆。有些人使用整数或字符串来定义常量,而另一些人则使用枚举。. 我还遇到了在它们自己的接口中定义常量–其中使用常量的类必须实现接口。此策略通常称为接口常量设计...

    对于Java中的常量这一主题,似乎存在许多混淆。有些人使用整数或字符串来定义常量,而另一些人则使用枚举。.

    我还遇到了在它们自己的接口中定义的常量–其中使用常量的类必须实现接口。此策略通常称为接口常量设计模式。

    在本文中,我们将查看在Java中存储常量的两种最常见的策略:整数和枚举。

    首先,无论何时决定使用常量,您都应该非常肯定常量不会随着时间的推移而改变,这样就可以避免重新编译。

    在本文中,我们将使用一个非常常见的常量候选-工作日!

    让我们假设,我们有一个类表示在线商店中的订单,在那里我们希望跟踪订单发生的一周中的哪一天。

    我们班的样子如下:

    public class Order {
        private [datatype] weekDay;
        public [datatype] getWeekDay() {
            return weekDay;
        }
        public void setWeekDay([datatype] weekDay) {
            this.weekDay = weekDay;
        }
    }
    

    注意,该类暂时不会编译-[datatype]只是我们将要使用的常量类型的占位符。

    用整数定义常量

    在Java中定义常量的最常用方法之一是通过整数,其中整数变量是静态的。

    public static int MONDAY = 0;
    public static int TUESDAY = 1;
    public static int WEDNESDAY = 2;
    public static int THURSDAY = 3;
    public static int FRIDAY = 4;
    public static int SATURDAY = 5;
    public static int SUNDAY = 6;
    

    定义整数常量时要问的第一个问题是将它们放在哪里。我们直接把它们放在 Order 班级?还是我们给他们上课?

    因为天是相当一般的,而不一定只是连接到类型的对象。Order,我们将在它们自己的类中定义它们 WeekDay.

    public class WeekDay {
        private WeekDay(){}
        public static int MONDAY = 0;
        public static int TUESDAY = 1;
        public static int WEDNESDAY = 2;
        public static int THURSDAY = 3;
        public static int FRIDAY = 4;
        public static int SATURDAY = 5;
        public static int SUNDAY = 6;
    }
    

    您可能注意到私有构造函数–这是为了避免客户端实例化类。该类只包含静态变量,这些变量不绑定到对象,因此不需要实例化类。

    现在,每当我们需要为一个订单设定一个特定的日期时,我们就这样做:

    Order order = new Order();
    order.setWeekDay(WeekDay.MONDAY);
    

    当我们想要检查订单是否发生在星期五的时候,我们只需打个电话:

     if(order.getWeekDay() == WeekDay.FRIDAY) 
    

    到现在为止还好。这个设计肯定不会有什么问题吧?

    那么,让我们假设一年后您将返回此代码–您必须检查订单是否发生在星期一。

    哦,当然-你完全忘记了WeekDay上课…。
    在这个场景中,您可以尝试这样的方法:

     if(order.getWeekDay() == 1) 
    

    在那一刻,完全忘记了平日课,这段代码是非常有意义的。星期一是一周的第一天,所以平日应该是1,对吧?

    但是不,它不是,因为静态int变量星期一被定义为0 在我们WeekDay班级!

    这是一个很好的例子,说明了为什么你应该考虑避避整数常量的使用。它们容易出错,令人困惑,很难调试.

    用Enum定义常数

    在Java中定义常量的另一个选择是使用枚举.

    在使用枚举时,常量类将如下所示:

    public enum WeekDay {
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY
    }
    

    注意没有私有构造函数–程序员不需要(你!)强制类不可实例化,因为枚举在默认情况下是不可实例化的!

    设置WeekDay顺序与整数常量完全相同:

     order.setWeekDay(WeekDay.MONDAY);
    

    至于订单是否是在星期五处理,我们如何处理也没有区别:

     if(order.getWeekDay() == WeekDay.FRIDAY) 
    

    但是,关键的区别在于,这是在Order班级。

    双管齐下order.setWeekDay(1);和if(order.getWeekDay() == 1)将使编译器抛出一个错误,因为当变量应该是类型时,您将尝试使用类型为整型的变量。 WeekDay!

    回想一下您完全忘记了WeekDay班级。
    对于枚举,这不再是一个问题。如果尝试使用整数而不是WeekDay,编译器只会抛出一个错误,告诉您需要使用WeekDay明灯。

    换句话说,唯一能让你检查订单是否发生在星期五的事情是:

     if(order.getWeekDay == WeekDay.FRIDAY) 
    

    再清楚不过了!

    您不再被迫记住常量类,如果任何客户端使用您的代码,他们就不必怀疑星期一实际上是用0表示还是用1表示。

    Enum将使您的代码更容易阅读,更易于维护!

    展开全文
  • Java常量Java常量定义和分类

    千次阅读 2019-07-11 15:14:34
    下面我们来系统地认识一下 Java 常量值,以及定义常量的方法。 常量常量值又称为字面常量,它是通过数据直接表示的,因此有很多种数据类型,像整型和字符串型等。下面一一介绍这些常量值。 整型常量值 Ja...
  • Java 使用 final 关键字来修饰常量。 虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量常量常量值又称为字面常量,它是通过数据直接表示的,因此有很多种数据类型,像整型和字符串型...
  • java map常量定义

    千次阅读 2018-11-22 20:36:00
    Java中定义Map常量,List常量 一般的方式的使用静态代码块。比如: 1 2 3 4 5 publicfinalstaticMap map =newHashMap(); static...
  • 静态定义常量

    2016-11-06 21:59:30
    java 定义静态常量
  • java系统常量定义的几种方式

    千次阅读 2019-05-06 16:39:42
    1、接口定义 public interface ConstantCode { public final static String OK = "ok"; } 接口的成员变量只能是常量,默认修饰符 public static final 看似正好符合常量的使用规范,但是接口的意义是可以被...
  • 本文为大家介绍一下java接口中定义常量的访问方法,希望对大家有帮助。
  • 主要介绍了Java变量常量声明和定义原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Java 使用枚举定义常量

    千次阅读 2020-02-10 10:07:22
    枚举比较常用的场景就是用于常量定义,但是相比于使用“static final”,枚举类型会增加内存的消耗,这个就是枚举的缺点,但是对于目前的硬件来说,这点还是可以忽略的。 使用枚举定义常量 packa...
  • Java 常量都可以定义在哪里?

    千次阅读 2019-03-04 16:12:44
    可是小编在实际开发还真的遇到了一个相关的麻烦,敦促我把这个知识点梳理一下。大神可以飘过,小白还真是要了解一下的好。 常量使用目的 1、常量提取出来有利于代码阅读,而且下次再做这种判断不用手写或复制,...
  • java项目中常量到底该怎么定义

    万次阅读 2016-10-13 17:46:33
    背景:由于最近要接手一个老的系统,在看代码逻辑的过程,看到程序有很多魔法数字,所以着手把系统常量单独提取出来,然后定义常量。本来这样就可以完工了,可是我有俩疑问: 1,为什么要将常亮提取...
  • 本文作者:苏生米沿java中使用的常量可以集中定义在一个文件。 有两种解决方案: 1.在Constants.java中定义,每个都要加上 public static final String… 2.直接在接口中定义: static String…用法都一样,在...
  • java中定义常量的三中方法

    千次阅读 2018-07-15 00:00:16
    主要讲解如何在java中定义常量:/** * Method One */ interface ConstantInterface { String SUNDAY = "SUNDAY"; String MONDAY = "MONDAY"; String TUESDAY = "TUESDAY"; ...
  • JAVA定义常量的常用方法

    千次阅读 2018-05-29 21:52:17
    常量定义 * */ public static class Field01Constant { /** * 第一个字符串变量 */ public static final String FIRST_STRING_CONSTANT = "ABC"; /** * 第二个int变量 */ public static ...
  • Java编程如何定义全局常量

    万次阅读 2018-09-12 23:30:43
    Class定义常量方法(推荐方法) //final修饰符 public final class Constants { //私有构造方法 private Constants() {} public static final int ConstantA = 100; public static final int ConstantB = 100...
  • Java中定义常量几种方式

    万次阅读 2017-08-20 22:51:18
    在开发定义常量是很常见的事,但常量定义有哪几种方式可选?各种定义方式有什么优缺点?咱们就用这篇小文来梳理下^_^ 1.通过接口Interface来定义(不推荐) 定义方式如下: 我们可以这样使用它...
  • java语言变量与常量定义

    千次阅读 2018-03-28 09:51:40
    前言:变量与常量定义、区别一、变量与常量的命名规则 ①、变量的定义 ·变量的定义必须严格按照标识符的命名规则,即0~9数字、字母、下滑线、$等组成,且首字母不能是数字、不能是java关键字。 ·首字母必须...
  • Java常量定义

    2021-01-20 03:44:48
    一、接口中定义常量:  由于java interface声明的字段在编译时会自动加上static final的修饰符,即声明为常量。  public interface Constants{  String name = 111;  }  public class read{  public ...
  • java常量和变量的定义

    2020-06-23 11:24:29
    java常量的分类 常量分类 说明 举例 字符串常量 用字符串括起来的多个字符 “happy”、“大佬” 整数常量 不带小数的数字 1,20,300,4000 小数常量 带小数的数字 1.1,2.2,30.0 字符常量 只有一个字符的...
  • 接口当中也可以定义“成员变量”,但是必须使用public static final 三个关键字进行修饰。 从效果上来看,这其实就是接口的【常量】 格式: public static final 数据类型 常量名称 = 数据值; 备注: 一旦使用final...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 323,393
精华内容 129,357
关键字:

java中常量的定义

java 订阅