создание подэкземпляров класса от базового класса

У меня есть много напечатанных исключений который вся акция та же самая особенность: они считают статус (международной) областью, которая является всегда отличной от нуля. Кодекс, как правило, проверяет на переменную статуса и если это - отличные от нуля броски соответствующее исключение (в зависимости от контекста). Т.е.:

if (status != 0) throw new AStatusException(status);
...//other context
if (status != 0) throw new BStatusException(status);
...//other context
if (status != 0) throw new CStatusException(status);

Главным образом из curiusity я думал, что мог бы осуществить эту общую функциональность в статическом методе throwIfNotZero базового класса StatusException и иметь различное A, B, CStatusException классы, все наследуют тот класс. Это, надо надеяться, позволило бы мне писать код как это:

AStatusException.throwIfNonZero(status);
...//other context
BStatusException.throwIfNonZero(status);
...//other context
CStatusException.throwIfNonZero(status);

К сожалению, самым близким, который я получил, является код, который я прилагаю в конце почты, которая не является очень удовлетворительной. Есть ли лучший способ сделать это, возможно не используя Отражение и/или избегая требования, чтобы передать экземпляр класса, который кажется избыточным (см. 'использование')?

Основное исключение

import java.lang.reflect.InvocationTargetException;

public class StatusException extends Exception {
    public int status;
    public StatusException (int status) {
        this.status = status;
    }

    public static  void raiseIfNotZero(Class klass, int code) throws T{
        try {
            if (code != 0) throw klass.getConstructor(Integer.TYPE).newInstance(code);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

}

использование:

AStatusException.raiseIfNotZero(AStatusException.class, status);
BStatusException.raiseIfNotZero(BStatusException.class, status);
1
nl ja de
Печально статические методы на Яве не унаследованы. Следовательно, когда вы призываете AStatusException, вы на самом деле статически связаны со статическим методом в StatusException, который не содержит информации, о котором конкретном подклассе вы ссылаетесь.
добавлено автор Claudio, источник
Один способ пойти не СУХ, и повторите статический raiseIfNotZero метод в каждом реальном классе, так как код не действительно настолько большой, если вы удаляете стычку отражения. Однако, it' s ужасное кодовое повторение.
добавлено автор Claudio, источник

2 ответы

Можно перегрузить функцию raiseIfNotZero() в суперклассе StatusException.

И назовите его как это

StatusException.raiseIfNotZero(AStatusException.class, status);
StatusException.raiseIfNotZero(BStatusException.class, status);
1
добавлено
Да, я могу сделать это с существующим кодом, как это.. вещь, я надеялся на способ только определить подкласс только однажды и избежать необходимости передавать объект класса.
добавлено автор Marcus Junius Brutus, источник
public static int final STATUS_EXCEPTION_A=1;
public static int final STATUS_EXCEPTION_A=2;


raiseIfNotZero(int type, int status)
{
   switch(type)
   { case STATUS_EXCEPTION_A: throw new AStatusException(); break;
     case STATUS_EXCEPTION_B: throw new BStatusException(); break;
     ...
   }
}
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async