【问题标题】:Grouping classes with an interface in Java在 Java 中使用接口对类进行分组
【发布时间】:2014-02-26 11:17:02
【问题描述】:

我有从 4 个超类扩展而来的 40 个标签类。我想将这 40 个类中的每一个分类为技术标签或用户标签。

我只对技术标签感兴趣。制作一个内部没有方法的接口TechnicalTag 并在每个我想成为技术标签的类中实现它,这样我就可以使用instanceOf 来选择它们,这是一个好的设计吗?

我不想要一个返回 boolean 的方法 isTechnicalTag 的原因是因为这意味着我必须在所有 40 个类中实现它们。而目前的技术标签可能只有其中的 4 个。

请给我建议。 OOP 并不是我所接受的培训。

【问题讨论】:

  • 是的,这将是一个好方法,但是注释你的类会更好。

标签: java oop interface grouping


【解决方案1】:

这种方法是一种称为Marker Interface 的设计模式。你可以阅读更多关于它的信息here。 Java 在他们的代码中都使用了这一点。一个例子是Serializable 接口,它不包含继承方法,但允许序列化实现它的类。

采用这种方法完全没问题。这种方法还使您的代码具有相当的可扩展性。例如,通过对接口进行编程(Java 喜欢的另一件事),您可以将类本身的知识与使用它的类分离。这意味着,例如,如果您想更改存在于原始对象内部的方法,假设它是Tag,那么您可以这样做,而无需更改使用该对象作为TechnicalTag 接口的类.

注释

我在 cmets 中看到过关于注解的内容。这是您可以采用的另一种方法,它会产生一些非常漂亮、干净的代码。您广泛阅读了有关注解及其使用here 的内容。

作为一个简短的总结,你可以这样写:

@TechnicalTag
public class MyTag
{
    // Code for my tag.
}

【讨论】:

    【解决方案2】:

    实际上OO编程的思想并不是你在你的主程序中根据你管理的对象的实际实现做不同的事情,而是你把你的程序写到接口上,然后具体的实现隐藏了什么细节他们在做。

    这就是说,我们都知道即使在JDK中也有一些实现'特殊'接口的类,例如RandomAccess,而RandomAccess的用途与您的需要相同...所以您的想法不是如果你觉得有必要,那就太奇怪了。

    【讨论】:

      【解决方案3】:

      您可以按照您所说的创建接口,在这种情况下它将成为标记接口。您可以在此处阅读更多相关信息:

      http://javarevisited.blogspot.co.uk/2012/01/what-is-marker-interfaces-in-java-and.html

      【讨论】:

        【解决方案4】:

        您可以为 isTechnicalTag() 方法设置默认实现,该方法默认返回“false”。

        只有在你想要技术的类中,你可以重写这个方法并返回true。

        【讨论】:

        • 是的,好的。但是点击 40 个类来实现未实现的方法并删除 TODO 注释仍然是相当多的工作:)
        • 难道你没有可以实现 isTechnicalTag() 的通用超类吗?
        • 不幸的是,它在任何超类中都无法识别。
        • 那么@christopher 上面的答案就是要走的路。
        猜你喜欢
        • 2011-10-19
        • 2011-05-17
        • 1970-01-01
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 2012-06-11
        相关资源
        最近更新 更多