Хотя вы могли бы написать то, что делаете, с меньшим количеством кода, я думаю, что, возможно, есть более чистый способ, который вы должны рассмотреть. Вы можете создать абстрактный метод, который должны реализовывать расширяющие классы для создания нового экземпляра. Это гарантирует, что всегда есть безопасный конструктор для вызова и никаких исключений для экземпляров, с которыми можно справиться. Для вашего случая это будет выглядеть примерно так:
public abstract class AbstractClass {
protected abstract AbstractClass newInstance(String str1, String str2);
public void foo() {
Object piece = newInstance("one", "two");
}
}
public class MyClass extends AbstractClass {
protected AbstractClass newInstance(String str1, String str2) {
return new MyClass(str1, str2);
}
}