繁体   English   中英

如何设计多个类是否使用某些常量

[英]how to design if some constants are used by multiple classes

我很少有多个类使用的常见常量。

在这种情况下,最有效的设计方法是:

  1. 我应该在每个类中重新定义常量吗?
  2. 还是应该在公共类中分离此类常量,并在每个类中使用这些常量(在单独的类中)?

还是还有其他更好的方法?

注意:-我正在寻找适用于此的最佳OO技术。

常量应该与某种类型严格相关,而不仅仅是“存在”。 Constants类似乎很方便,但很快将变得难以维护,更不用说许多人将其视为反模式。

很难在不看代码的情况下提出改进建议,但是如果您发现自己需要在类型范围之外的几个不同类中定义的相同常量,则似乎需要重新考虑设计。

提供Constant Util类是最干净的方法。

class ConstantUtil {
    public static final int MAX_SIZE = 1<<10;
}

典型的文件夹层次结构是这样的

com.example.util.ConstantUtil

如果争用者专用于api,请在此处定义它们。 例如

 public interface TaskService {

     public static final int PRIORITY_LOW = -1;
     public static final int PRIORITY_NORMAL = 0;
     public static final int PRIORITY_HIGH = 1;

     public void schedule(Task task, int priority);
 }

如果常量没有关联到单个api,则定义一个常量接口。 例如javax.swing.WindowConstants

还是还有其他更好的方法? 注意:-我正在寻找适用于此的最佳OO技术。 爪哇

这使我们回到了如何使用常量的问题。 大多数情况下,它们用于编写条件代码。 例如

 public class TaskServiceImpl implements TaskService {

     private List<Task> lowPriority = new ArrayList<Task>();
     private List<Task> normalPriority = new ArrayList<Task>();
     private List<Task> highPriority = new ArrayList<Task>();

     public void schedule(Task task, int priority){
         if(priority == PRIORITY_HIGH ){
             highPriority.add(task);
         } else if(priority == PRIORITY_LOW ){
             lowPriority.add(task);
         } else if(priority == PRIORITY_NORMAL){
             normalPriority.add(task);
         } else {
             ....
         }
     }
 }

在这种情况下,找出常量的目的是什么。 在上面的示例中,目的是对任务进行分组,或者如果您进一步考虑将其排序以便执行。 将该逻辑移到自己的类上。 例如,介绍一个可能实现可CompareablePriority类;)

您也可以看一下我有关类型开关的博客https://www.link-intersystems.com/blog/2015/12/03/enums-as-type-discriminator-anti-pattern/ 这是关于枚举的滥用,但也适用于常量。

您可以尝试创建一个包含所有常量的类(即第二种方法)。

例如:

classname :  MyConstantsClass.java    
public static final String SOME_CONSTANT="value";

然后像

MyConstantsClass.SOME_CONSTANT

正如有人建议使用接口创建常量那样,我认为这不是一个好选择。 由于使用接口创建常量也有某些缺点:

  • 接口的使用不允许实现将常量转换为可见/人类可读表示的机制。
  • 如果常量是“实现细节”,则接口可能不是该值的自然位置(CodeSmells,ListenToTheCode)。
  • 由于Java编译器的优化,如果常量发生更改,则必须使用常量对所有类进行完整的代码重新编译。 仅更改接口并重新编译它是行不通的(但是,所有常量都定义为“ static final”的情况)

请参考:

常量类:

 interface Constants {
    int CONSTANT_ONE = 0;
    int CONSTANT_TWO = 1;
    int CONSTANT_THREE = 2;

    String BASE_PATH = "YourPath";
 }

和用法:

if (someValue == Constants.CONSTANT_ONE) {

 }

编辑:在大多数情况下使用interface ,而不是class ,如果没有必要实施一些类这个接口的话,就不需要添加这种public static final ,因为默认情况下它是public static final使你的代码看起来更干净。

设计一个类似AppUtil.java的类,并定义您的常量public static final,如下所示:

public class AppUtil
 {
   public static final String IMAGE_STATUS="0";

 } 

以及当您想使用变量use时。 如下所示:

AppUtil.IMAGE_STATUS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM