Можно ли определить метод без расширения классов?

((JComponent) c).paintComponents(Graphics a) {
    // Paint some one
};
0
Adrian Preuss 11 Фев 2015 в 18:24
Какова ваша цель? Вы просто пытаетесь сократить количество классов, которые вы пишете? Будет ли использование анонимного класса делать то, что вам нужно?
 – 
Andy Brown
11 Фев 2015 в 18:26
В Java все методы должны быть определены внутри класса. Если вы хотите, чтобы метод был доступен без создания экземпляра класса, используйте квалификатор static.
 – 
mstbaum
11 Фев 2015 в 18:27
Stackoverflow.com/questions/4359979/java-эквивалент-к-c-sharp-extension-методы
 – 
Florian Lavorel
11 Фев 2015 в 18:29

2 ответа

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

JComponent c = new JComponent() {
    @Override public void paintComponent(Graphics g) {
      // do stuff
    }
}
3
Andy Brown 11 Фев 2015 в 18:28
Да, вы можете, но это слишком сложно, поэтому это нужно делать только в том случае, если вам действительно нужна такая функция. С другой стороны, вы можете использовать шаблон декоратора для динамического добавления поведения к вашим объектам.
 – 
Luiggi Mendoza
11 Фев 2015 в 18:29
2
Я бы не стал называть это сложным, а затем предлагать манипуляции с байт-кодом.
 – 
Sotirios Delimanolis
11 Фев 2015 в 18:33
1
Я упомянул комплекс для да, вы можете (используя манипуляции с байт-кодом). На самом деле, ИМО, у нас недостаточно информации в вопросе, чтобы дать правильный ответ.
 – 
Luiggi Mendoza
11 Фев 2015 в 18:35
1
@Луиджи Мендоза. Спасибо, пенни падает (для меня) - когда я сказал «Нет, но ...», вы правильно сказали «Да, вы можете, если вы сделаете ... (сложные вещи)». Я с вами полностью согласен. Я думаю, что OP потенциально дает нам проблему X Y. Мой ответ был предположением о решении его фактической проблемы и предположением, что он хотел сделать что-то вроде Java, эквивалентного методам расширения C #. Я попросил у него больше контекста, но у нас его пока нет.
 – 
Andy Brown
11 Фев 2015 в 19:10
1
Разве манипулирование байт-кодом не является решением всех ИТ-проблем? Например, если вы манипулируете сохраненным байт-кодом вашего жесткого диска, устанавливая новое приложение... :)
 – 
SME_Dev
11 Фев 2015 в 19:12

Нет. Это невозможно. Java не является интерпретируемым языком программирования. Он скомпилирован. Например, вы можете сделать это на Ruby.

-1
Cortwave 11 Фев 2015 в 18:27
1
Неверно. Вы можете сделать это с помощью манипуляций с байт-кодом, используя такую ​​библиотеку, как cglib, которая позволяет вам писать код на лету.
 – 
Luiggi Mendoza
11 Фев 2015 в 18:28
Да, но мне не нужно манипулировать внешними библиотеками, такими как Javaassist или другими.
 – 
Adrian Preuss
11 Фев 2015 в 18:29
1
Будет здорово, если вы дадите больше контекста проблеме. По сути, хорошим ответом будет: Да, можно. Период.
 – 
Luiggi Mendoza
11 Фев 2015 в 18:30
1
Да, ты можешь. Но это будет плохо спроектированное решение. Если вам действительно нужно использовать эту функцию, вам следует подумать об использовании другого языка программирования.
 – 
Cortwave
11 Фев 2015 в 18:31
Использование манипуляций с байт-кодом — неплохое дизайнерское решение. Это зависит от того, что вам нужно. Например, Spring делает это, когда ему нужно создать прокси для ваших классов, чтобы добавить в них функции управления транзакциями, и я не думаю, что они следуют плохой практике все эти годы на рынке. У нас нет надлежащего контекста, поэтому на этот вопрос нет конкретного ответа, кроме да, это возможно.
 – 
Luiggi Mendoza
11 Фев 2015 в 18:34