Добавление методов к существующему классу в android

Я ищу способ добавить некоторые методы в существующий класс следующим образом:

String s = ""; s.doSomething(); 

В объекте C я могу использовать категорию для этого.

 @interface NSString( Stuff) -(void)doSomething(); @end 

У Android есть что-то подобное? Или еще один взлом?

Обновление : На самом деле, у меня возникла эта проблема: я использую класс (не окончательный) из jar-файла (поэтому я не могу коснуться его исходного кода). Затем я хочу добавить методы (или что-то в этом роде) в этот класс без использования наследования. Например:

  public class Provider{ // many methods and fields go here... public String getName(){} } 

Все, что я хочу сделать, это:

  provider.print(); //that call getName() method; 

Я также пробовал шаблон прокси , он работал, но мне это не нравится ( потому что он, как класс-оболочка, должен хранить объект со многими полями и методами для использования только одного метода):

  public class ProxyProvider{ Provider provider; public ProxyProvider(Provider provider){ this.provider = provider; } public void print(){ String name = provider.getName(); //do something } } 

Есть ли способ решить это?

Вы можете создать класс утилиты со статическими методами:

 public final class ProviderUtils { private ProviderUtils() {} // not instantiable, it is a utility class public static void print(Provider provider) { String name = provider.getName(); // print the name } } 

В своем коде вы можете вызвать его:

 Provider p = new Provider(...); ProviderUtils.print(p); 

И если у этого класса есть только один метод print , вы можете назвать его ProviderPrinter вместо ProviderUtils .

В конце концов у вас нет тысяч возможностей – вы можете:

  • Расширьте класс и любой метод, который вам нужен в подклассе => вы сказали, что не хотите, чтобы
  • Изменить исходный код класса и перекомпилировать собственную версию фляги
  • Оберните класс в оболочку, которая добавит нужные вам методы (пример вашего ProxyProvider)
  • Поместите методы, которые вам нужны, в статический класс полезности (что я предложил выше)
  • Модифицируйте класс во время выполнения и добавьте метод, но это сложный путь, потому что вам нужно играть с загрузчиками классов.

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

Кроме того, добавление поведения путем подклассификации во многих случаях считается плохой практикой – соединение просто слишком сильное и использует вас для экземпляров ваших объектов, которые вы когда-либо создадите. Эмпирическое правило – «предпочтительная композиция над наследованием».

Сказав это, существует множество подходов / шаблонов для решения вашей особой проблемы. Декоратором может быть образец, который вы ищете.

Пожалуйста, обновите свой вопрос или опубликуйте новый с дополнительной информацией.

Невозможно, однако, существует Java-доступная DSL, доступная под названием Xtend, которая может использоваться как неотразимая замена JAVA, которая может работать, глядя на которую поддерживаются методы расширения, подобные этому.

http://www.eclipse.org/xtend/

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я никоим образом не связан с этим. Я просто жадный пользователь основной технологии, которая использовалась для создания xtend, называемого xtext. Я рассмотрел использование xtend в проекте Android

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

подобно

  public class MyString { private String internal; //your methods } 

Попытайтесь продолжить разработку своей проблемы, чтобы я мог дать лучший ответ. Например, что представляет собой реальный объект и что вы действительно хотите сделать, если вы можете раскрыть его.