在 java 中命名对象的最佳实践

Best Practice for naming objects in java

我需要为 java 中的对象子集取一个唯一的名称。基本上我有一个显示对象和它的多个实例。显示的每个实例都需要有一个唯一的名称以用于审计目的。这样当您查看审核时,您就会知道审核了哪些显示。我正在寻找的是如何将此作为可能使用设计模式的最佳实践。以下是我目前的一些想法

想法 1 使用 toString() 每个对象都已经有一个 toString 因此重写它应该提供一种简单的方法来命名对象。不利的一面是所有对象都有一个 toString,因此很难强制 Display 对象填充它们,而其他所有对象都不需要它。

想法 2 使用接口。我可以创建一个名为 IDisplayName 的接口,其中包含一个名为 getName() 的函数。我的 Display 对象可以实现此接口,因此我的具体 classed 需要设置它。这是我目前实现的。

想法 3 与 IDEA 2 相同,但具有 getName() return ENUM 而不是 String。这样我也许可以在单个文件中强制执行唯一性,并且 ENUM 将具有 displayString 属性。这个问题是有很多显示对象> 100所以它可以变得非常快非常快。

想法 4 只需记录 class 名称。这不能很好地工作,因为程序员不阅读审计,所以我更愿意让审计更友好。

在此先感谢您的帮助。

我的观点是你应该使用一个接口。当然,虽然可以为此目的重用 toString 或 class 名称,但这显然以一种未来读者不清楚的方式超载了它们的使用。例如,如果未来的重构拆分 classes,审计线索将以未定义的方式改变。同样,toString 实施可能会因多种原因而改变。

与其调用您的界面 IDisplayName,我建议将其命名为 Auditable 或类似名称以使其目的显而易见。理想情况下,您的审计方法将采用 Auditable.

interface Auditable {
    public String getAuditName();
}

如果 class 只需要是唯一的,那么我会让显示对象的每个实例都与某个 ID 相关联,这就是我的做法: 在您的显示 class 中,您应该有一个静态常量,并且每个显示实例都应该分配一个 ID。该 ID 将是当时 Display 中常量的值。然后一旦你分配了 id 值,你就增加了常量的值。然后你给你的 Display class 一个 getId() 方法,允许你在所有子classes 上调用它并为每个实例获得一个唯一标识符。

public class Display(){
    private static int idCounter = 0;
    private final int id;
    public Display(){
    id = idCounter++;
    }
    public int getId(){
    return id;
    }
}

现在 Display 的每个实例(包括子classes)现在都会有这个唯一的 ID,您可以调用它来识别它。

我不会使用 toString,因为它可能有其他用途(如调试)或打印对象状态。如果 returning class 名称对于非程序员来说不清楚,那么对于程序员来说可能也不清楚。我的意思是,如果您使用 干净代码 的原则,您的 class 名称 应该 对每个人都清楚。那么您当然必须通过仅显示简化的 class 名称来删除包:String simplifiedClassName = qualifiedClassName.substring(qualifiedClassName.lastIndexOf(".") + 1).

如果你想更灵活,你的 IDisplayName.getName 可以这样定义:

default String getName() {
    String qualifiedName = getClass().toString();
    return qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1);
    }

它是一个接口默认方法,这意味着程序员只能在他们认为必须的classes 中覆盖它。

另一种可能,如果你需要internationalization/localization: 您的 getName 可以从属性文件中读取名称,其中 属性 key 是简化的 class 名称。 属性 个文件可以由非程序员编辑,一个 属性 个 100 个条目的文件并不大。保证属性文件中值的唯一性也很容易。

编辑 Java 7: 除了 IDisplayName 接口,创建一个名为 DisplayNameUtil 的 class,其中 getName 是一个静态方法:

public static String getName(Object obj) {
    String qualifiedName = obj.getClass().toString();
    return qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1);
    }

然后,在你的大部分显示 classes(或普通的 superclass)中,你可以添加:

@Override
public String getName() {
    return DisplayNameUtil.getName(this);
    }

程序员仍然可以return 为选定的 class 命名, 如果需要,界面 getName 仍可访问属性文件。

有一个为接口方法提供默认行为的 Util class 是 一个 Java 7 模式。顺便说一句,建议删除伴侣 Util classes 从 Java 7 移动到 8 时进行重构。换句话说,如果您的代码曾经 被翻译成 Java 8 很容易重构它以使用默认值 接口中的方法并删除 Util class.