【问题标题】:Is there a way in Java to build custom types based on java.lang base Types (e.g. String)?Java 中有没有办法基于 java.lang 基本类型(例如字符串)构建自定义类型?
【发布时间】:2019-01-14 09:55:41
【问题描述】:

在 Java 中是否有一种方法可以基于原始 Java 基类创建自定义类以赋予派生类语义?

示例:我想创建一个LinkedHashMap<LastName, Age> ages,其中LastNameString 的自定义类型,Age 是从Integer 派生的自定义类型。我只是尝试创建自己的课程

public class LastName extends String {
    //(no code in here, LastName has the same functionality as String)
}

但这是不可能的。还有其他方法可以实现我想要的吗?

【问题讨论】:

  • (这个问题的答案应该是@OverridehashCodeequals,可能是toString,如果他们很时髦,compareTo。)

标签: java inheritance custom-type


【解决方案1】:

您可能想要的是类型别名。 Java 不支持这一点。

最好的方法是创建一个包装类,如下所示:

class LastName{
    private String value;
} 

另一种方法是正确命名变量,例如不要这样做:

String string = "Smith";

宁可这样做:

String lastName = "Smith";

或者只是用 cmets 和 javadoc 记录您的代码。


旁注:如果您仍想使用类型别名,您可能需要使用Kotlin programming language,它可以编译成 java 代码(以及更多)。

【讨论】:

  • 我根据习惯做的正确命名。我喜欢 class LastName {...} 方法,但仍然感觉有点笨拙,因为必须使用 setter 和 getter 访问值,这就是为什么我不接受它作为我的问题的解决方案(还)。总之谢谢
  • @WolfiG 最好的方法是结合第二个和第三个建议。尽可能清楚地命名所有内容并记录可能不清楚的内容。在我看来:使用类名作为文档只是糟糕的设计,并引入了另一个级别的复杂性
【解决方案2】:

这些类是最终的。

通常的处理方法是创建包装类。

例如:

public class LastName {
    private final String value;
    public LastName(String value) {
        this.value = value;
    }
    public String get() { return value; } 
}

【讨论】:

  • 您能详细说明一下包装类的创建吗?
  • @WolfiG 这和 Lino 给你的一样。 LastName 是一个包装类,因为它包装了String
  • @WolfiG 我添加了示例。
  • 好的,就像我对 Lino 说的那样,有点笨拙,但似乎这是最有效的方法......谢谢
  • 也许让final 上课?并将get() 替换为toString(),以允许隐式转换;)
【解决方案3】:

String 实现了CharSequence 接口,就像StringBufferStringBuilder 类一样。您可以遵循相同的流程。

public final class LastName implements CharSequence {

...

}

【讨论】:

  • String 的方法比CharSequence 多得多。
  • 即使在 JDK 中,大多数方法参数都需要字符串,而不是字符序列。因此,CharSequence 通常不是 String 的合适替代品。
  • 你没有抓住重点。 String 的主合约来自CharSequence,所以如果你接受CharSequence,你基本上可以接受String。其余方法仅特定于 String 但不会违反合同。 String 是不可变对象,而 StringBuilderStringBuffer 是“可变”字符串。
  • @Michael 您可以引用CharSequence 来接受CharSequence,这实际上意味着String 是可以接受的。
  • @BuhakeSindi 假设我想从我的地图中获取一个字符串 - 因为大多数方法 only 接受字符串,无论好坏 - 然后我需要调用 toString on每次我需要这样做。这是低效的。您提议实现整个接口(几乎可以肯定是以比 JDK 作者所做的更糟糕的方式)只是为了获得一个类型别名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 2010-10-16
  • 1970-01-01
  • 2020-10-22
  • 2020-06-06
  • 2019-11-06
  • 1970-01-01
相关资源
最近更新 更多