在 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.
我需要为 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.