【问题标题】:What is the best practice of inheriting constants in Java?在 Java 中继承常量的最佳实践是什么?
【发布时间】:2020-01-02 09:06:16
【问题描述】:

我有一个抽象类,其中包含每个子类将使用的一些常量。它们中的每一个都是静态的、最终的和不可变的

public abstract class MyAbstract {

    //some private instance fields

    protected static final long LONG_ID = 1;
    protected static final String STRING_ID = "example_id";

    //some methods

}

我知道使用 protected static final 是不好的做法,但是不可变的 protected static final 呢? 我知道我可以将它们公开,但我想避免这样做,因为常量指的是用户不需要知道的特定 ID。

【问题讨论】:

  • 在接口中声明常量不是更明智吗?
  • 为什么受保护的静态最终是不好的做法?
  • @Kenrig 为什么会更明智?这也会使它们隐含地公开。
  • @Ava 你回答了你自己的问题:什么是不好的做法不是受保护的静态最终字段。不好的做法是可变常量。
  • @Ava 无论如何,这就是可变对象的问题,而静态只会使情况变得更糟。随心所欲地去做吧,像这样的小细节不太可能影响任何事情(除了消耗你的开发时间)。

标签: java oop abstract-class encapsulation


【解决方案1】:

要回答题为“Java 中继承常量的最佳做法是什么?”的问题,我的回答是:根本不继承它们。

继承在面向对象编程中具有特殊的意义和目的,而使用继承只是为了方便,因为您希望能够访问一组特定类中的常量,这并不符合这个意义和目的。

如果您希望能够在不同的类中使用常量,您可以将这些常量放在一个单独的类中。将这个类设为final,将构造函数设为private,使其不能被子类化和实例化:

package com.example;

public final class Constants {
    public static final long LONG_ID = 1L;
    public static final String STRING_ID = "example_id";

    // Private constructor, this class should not be instantiated
    private Constants() {
    }
}

然后,在要使用常量的类中,使用import static

import static com.example.Constants.LONG_ID;

public class Example {

    public void someMethod() {
        // Use the constant
        long id = LONG_ID;
        System.out.println(id);
    }
}

优点是类Example不需要扩展类Constants或实现接口,所以你不需要误用继承,同时你仍然可以使用常量与语法简洁。

【讨论】:

  • 我不建议从Constants 静态导入一个常量,它在我看来是一个全局常量类,并不真正属于MyAbstract 层次结构的域。我宁愿使用GlobalConstants.IDModuleBConstants.ID,但是ID(作为来自MyAbstractConstants的静态导入字段)
  • @AndrewTobilko 我同意,这是一个有效的选择 - 与使用静态导入相比,使用类名前缀可以更清楚地了解常量的来源,但会带来一点便利。有些人不喜欢静态导入,因为它在静态导入的常量或方法的来源代码中并不是很明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多