Действительно ли возможно расширить класс без конструкторов в Java?

Вы забыли вызвать функцию (с ())

8
задан Raedwald 1 October 2013 в 07:42
поделиться

7 ответов

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

Если класс имеет только частные конструкторы тогда нет, не может.

18
ответ дан 5 December 2019 в 05:45
поделиться

Question has been answered, but to add a comment. This is often a good time to propose that code be written to be somewhat testable.

Don't be a pain about it, research what it takes (probably Dependency Injection at least), learn about writing mocks and propose a reasonable set of guidelines that will allow classes to be more useful.

We just had to re-write a bunch of singletons to use DI instead because singletons are notoriously hard to mock.

This may not go over well, but some level of coding for testability is standard in most professional shops.

3
ответ дан 5 December 2019 в 05:45
поделиться

Если в классе java нет определенных конструкторов, для вас нет проблем. Проблемы будут, если в классе будут определены какие-либо конструкторы, и все они будут для вас невидимы (частные).

2
ответ дан 5 December 2019 в 05:45
поделиться

Yes, you can mock the object, although it may not be possible to subclass it (certainly not without getting very intimate with the class loader, anyway). Here is how you do it with JMock.

Mocking in this fashion allows you to keep the type, without subclassing though it will probably quite hard to impossible to tease out only certain behavior. So this method is appropriate for testing classes that use this class, not for testing the class itself.

If you actually have access to the source code of the class, you could implement an inner class which allows you to extend it, although if you could do that, you could just make one of the constructors package private as well.

There are also dynamic languages which will allow you to do the subclassing, and implement a Java interface which the Java code can interact with, but I'm not that familiar with the details.

3
ответ дан 5 December 2019 в 05:45
поделиться

You can change the visibility modifiers via reflection. Here is an article listing how.

2
ответ дан 5 December 2019 в 05:45
поделиться

If there are only private constructors, you can still use reflection in order to be able to access them from outside that class.

0
ответ дан 5 December 2019 в 05:45
поделиться

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

Это набор инструментов для имитации Java, который позволяет вам издеваться над чем угодно. Даже если класс не является публичным и / или вложенным, его все равно можно высмеять. В JMockit есть несколько механизмов, которые можно использовать для этого. Дистрибутив инструментария также содержит множество примеров тестов JUnit.

Если класс реализует какой-либо интерфейс или расширяет абстрактный класс, вы можете указать JMockit «захватить» и имитировать реализации базового типа по запросу, поскольку они загружаются JVM, и даже назначить созданные экземпляры полю в тестовом классе.

1
ответ дан 5 December 2019 в 05:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: