2012-03-26 8 views
21

У меня есть интерфейс, который я хочу реализовать в отдельных классах после выполнения быстрого поиска Google, очевидно, Java не имеет частичных классов. Есть ли способ, которым я могу это сделать, или я застреваю, бросая весь свой код в один класс?Способ реализации частичных классов в 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#, и я бы поставил аналогичные методы, которые возвращают одинаковые значения в одном разделяемый класс (или, возможно, классов, которые обновляют запись в одном классе). Как бы это реализовать? Или я должен просто поместить все реализации метода в один класс?

Спасибо.

+8

«Некоторые из методов обслуживания действительно принадлежат к их собственному классу и кажутся нелогичными в одном классе». Тогда почему вы пытаетесь поставить их в один класс? Почему бы просто не поместить их в отдельные классы? см. [Принцип единой ответственности] (http://en.wikipedia.org/wiki/Single_responsibility_principle) – Jesper

+0

Java не имеет встроенных функций, которые облегчат вам работу. Есть несколько сторонних библиотек, которые могут помочь вам реализовать это.Мое предложение - попытаться решить вашу проблему без такого препроцессора. Для простых вещей введение препроцессора может стоить вам гораздо больше, чем экономит вас. –

+1

@ Jesper: Он на самом деле пытается реализовать принцип единой ответственности, но не использует композицию для ее достижения. –

ответ

31

В Java нет ничего похожего на частичные классы. Вы можете достичь многих из тех же преимуществ, используя агрегацию, делегирование и абстрактные базовые классы.

(я сдалась давлению со стороны сверстников и устранили замечание “ к счастью ”, который генерируется так много тепла в комментариях. Очевидно, что немного в сторону, кажется, заработали мне четыре downvotes, несмотря на то, никакого отношения к ответу.)

+4

@ EricJ. - Я понимаю, что частичные классы используют их. Однако они могут легко превратиться в кошмар. Сама Microsoft [предлагает] (http://msdn.microsoft.com/en-us/library/wa80x488%28v=vs.80%29.aspx), что они полезны для нескольких программистов для работы отдельно в реализации класса. Представьте себе, насколько весело было бы, когда частичный класс, над которым вы работаете внезапно (без ведома), наследуется от какого-то нового базового класса, потому что какой-то другой программист решил, что его частичный класс выиграет от него. Есть и другие подобные ужасы. Повторяю: к счастью, Java не боится этого. –

+7

Частичные классы очень полезны в формах, когда вам нужно отделить код управления пользовательским интерфейсом и все остальное. Но, признаюсь, я пытался использовать их в других обстоятельствах, и когда-то я заблудился. Если вы считаете, что вам нужно разбить класс (а не на форму), возможно, вам нужно переосмыслить свой подход ... –

+11

«Представьте себе, насколько весело было бы, когда частичный класс, над которым вы работаете внезапно (без ведома вам) наследуется от какого-то нового базового класса, потому что какой-то другой программист решил, что его частичный класс выиграет от него' - это также плохо, если рассматриваемый класс не был частичным классом. Я не думаю, что класс, являющийся частичным, здесь очень важен. –

1

Прежде чем отправиться на этот маршрут, вы можете рассмотреть Builder design pattern. Это позволяет вашей службе агрегировать реализации, реализованные в отдельных классах. Нет необходимости в предварительном компиляторе и очень чист с точки зрения OO.

Каждый класс компонентов несет определенную, узкую ответственность, а класс обслуживания привлекает сервисные классы компонентов для реализации только ответственности за обслуживание.

Если вы действительно хотите (не рекомендуется), вы можете использовать предварительный процессор для сборки частей класса перед компиляцией.

Единственный сценарий, который может иметь смысл в предварительном процессоре, заключается в том, что некоторые из ваших реализаций генерируются кодом, а другие части кодируются вручную. Прямым подходом может быть #include внешние фрагменты класса в основном файле .java и запустить предварительный процессор C перед файлом перед компиляцией.

+0

Это привело бы к нечитабельному и трудноподдерживающемуся коду. С Java лучше избегать любых предварительных процессоров. –

+0

@ Юджин: Правильно. Во-первых, я ответил на его вопрос, а затем предложил лучший подход. Я отредактировал свой ответ, чтобы уточнить, что маршрут до процессора не рекомендуется. –

1

Вы можете объявлять методы через несколько интерфейсов, а затем позволить вашим конкретным классам реализовывать несколько интерфейсов.

Более того, используя java.lang.Proxy, вы можете собрать свою службу с нескольких интерфейсов и делегировать вызовы фактических вызовов в отдельную реализацию.

+1

Реализация нескольких интерфейсов в одном классе более или менее является обратной частью частичных классов. –

2

Aspectj может быть ответом на функцию C# /. Net partial class! Spring Roo - одна из типичных рамок разработки с использованием aspectj для разделения функциональности класса на несколько разных файлов.