【问题标题】:A way to implement partial classes in java一种在java中实现部分类的方法
【发布时间】:2012-03-26 16:53:33
【问题描述】:

我有一个接口,我想在进行快速谷歌搜索后在单独的类中实现, Java 没有部分类。有没有办法可以做到这一点,或者我是否将所有代码都扔到一个类中?

基本上,我正在尝试编写服务。 一些服务方法确实属于它们自己的类,并且在同一个类中似乎有点不合逻辑。这是我正在尝试做的一个示例。

package com.upmc.esdm.messaging.epcd.service;
import java.util.List;

import javax.ejb.Remote;

import com.upmc.esdm.messaging.epcd13jpa.entities.EmailDomainTrust;


@Remote
public interface MessagingInterfaceRemote {
public List<EmailDomainTrust> getEmailDomains();

    public int upDateQualityTable();

    public string isLogial();

    public byte[] ToWritePartialClassesInJava();
}

我通常会在 C# 中使用部分类,并且我会将返回相似值的类似方法放入一个部分类(或者可能会更新一个类中的记录的类)。我将如何实现这一点?还是应该把所有的方法实现放到一个类中?

谢谢。

【问题讨论】:

  • "一些服务方法确实属于它们自己的类,在同一个类中似乎有点不合逻辑。"那你为什么要把他们放在一个班级里?为什么不把它们放在单独的类中呢?见Single responsibility principle
  • Java 没有内置功能可以让您轻松完成此操作。有一些第三方库可以帮助您实现这一点。我的建议是尝试在没有这样的预处理器的情况下解决您的问题。对于简单的事情,引入预处理器的成本可能远远超过它为您节省的成本。
  • @Jesper:他实际上是在尝试实现单一职责原则,而不是使用组合来实现它。

标签: java partial-classes


【解决方案1】:

Java 中没有像偏类这样的东西。您可以使用聚合、委托和抽象基类获得许多相同的好处。

(我已经屈服于同侪压力,并消除了在 cmets 中产生如此多热量的“谢天谢地”评论。显然,尽管与答案无关,但这一小事似乎为我赢得了四票。)

【讨论】:

  • @EricJ。 - 我知道部分类有其用途。然而,他们很容易变成一场噩梦。 Microsoft 本身suggests 表示它们对于多个程序员在一个类实现上单独工作很有用。想象一下,当您正在处理的部分类突然(您不知道)从某个新的基类继承时会多么有趣,因为其他一些程序员认为她的部分类将从中受益。还有其他类似的恐怖。我再说一遍:谢天谢地,Java 没有这个问题。
  • 当您必须分离 UI 管理代码和其他所有内容时,部分类在表单中非常有用。但我承认,我尝试在其他情况下使用它们,有时我迷路了。如果你认为你需要拆分一个类(而不是一个表单),也许你需要重新调整你的方法......
  • Imagine how much fun it would be when a partial class you're working on all of a sudden (unbeknownst to you) inherits from some new base class because some other programmer decided her partial class would benefit from it - 如果所讨论的课程不是部分课程,那也很糟糕。我不认为班级偏袒在这里很重要。
  • @KonradMorawski - 但危险性大大增强。来自the docs“如果任何部分声明了基类型,那么整个类型都会继承该类。” 通常,如果您从某个类继承,您完全有理由期望得到通知对基类的更改(至少,通常会有一个新版本发布)。对于部分类,您可能根本不会收到任何警告,因为更改可能来自对等方。
  • 如果“程序员”之一不是人类,即代码生成,部分类非常有用。这是我能看到的唯一用例,但是一个非常强大的用例,它将源代码级别的结构与 API 级别的结构分开。
【解决方案2】:

Aspectj 可以成为 C#/.net 部分类功能的答案! Spring Roo 是典型的开发框架之一,使用 aspectj 将一个类的功能划分为几个不同的文件。

【讨论】:

    【解决方案3】:

    在走这条路之前,您可能需要考虑Builder design pattern。这允许您的服务聚合在不同类中实现的实现。无需预编译器,从面向对象的角度来看非常干净。

    每个组件类都有一个特定的、狭窄的职责,服务类获取其组件类的服务来实现服务的职责。

    如果你真的想要(不推荐),你可以在编译之前使用预处理器来组装类的各个部分。

    预处理器可能有意义的唯一情况是,如果您的一些实现是代码生成的,而其他部分是手动编码的。一种直接的方法可能是在主 .java 文件中 #include 外部定义的类片段,并在编译之前对文件运行 C 预处理器。

    【讨论】:

    • 这会导致代码不可读且难以维护。对于 Java,最好远离任何类似的预处理器。
    • @Eugene:正确。首先,我回答了他的问题,然后提出了更好的方法。我编辑了我的答案,以更清楚地表明不建议使用预处理器路线。
    【解决方案4】:

    您可以通过多个接口声明方法,然后让您的具体类实现多个接口。

    此外,使用 java.lang.Proxy,您可以从多个接口组装您的服务,并将实际的方法调用委托给单独的实现。

    【讨论】:

    • 在单个类中实现多个接口或多或少与部分类相反。
    【解决方案5】:

    我讨厌提出一个旧线程,但我认为我会就给定的答案带来一个新的视角。 面向方面编程可能会更好地实现您尝试实现横切关注点的目标。

    您正在寻找一种强大的关联解决方案,您可以在其中将实施细节解析为不同的控制方法。 Spring framework 在这个领域非常突出,现在经常与微服务相关联。

    【讨论】: