В Java, как я могу убедиться, что фиктивный класс никогда не используется? - PullRequest
2 голосов
/ 20 июля 2009

Я работаю над проектом, в котором для решения проблемы управления версиями я создаю много классов, которые никогда не будут тестироваться и никогда не должны использоваться - они просто должны быть там, чтобы компилятор был доволен. Я хотел бы убедиться, что они никогда не используются. Сегодня утром у меня возникла идея добавить исключение в блок статической инициализации:

public class Dummy {

    static {
        throw new IllegalStateException("Do not use this class!");
    }
}

Но компилятору это не нравится. Можете ли вы придумать способ сделать это?

РЕДАКТИРОВАТЬ: чтобы быть понятным (моя вина, я не был ясен раньше), это не будут просто пустые классы. Здесь будет много всякого кода, и под словом «держите компилятор довольным» я действительно имел в виду, что в другом месте я буду его создавать, вызывать методы и т. Д. И т. Д. Я хочу, чтобы этот код где-то компилировался, но не выполнялся во время выполнения. Я принял ответ Джона, но также буду использовать @Deprecated и подробно документировать, как нужно.

Ответы [ 11 ]

10 голосов
/ 20 июля 2009

@ устарел

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

7 голосов
/ 20 июля 2009

Просто добавьте фиктивное условие:

public class Dummy {    
    static {
        if (true) {
            throw new IllegalStateException("Do not use this class!");
        }
    }
}

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

6 голосов
/ 20 июля 2009

Дайте ему конструктор по умолчанию private и сделайте class final.

3 голосов
/ 20 июля 2009

Предполагая, что вы не хотите, чтобы исключения IllegalStateException создавались в вашем производственном коде, используйте утверждения и убедитесь, что они включены в вашей среде QA / Test. Код тоже немного приятнее:

public class Dummy {
    static {
        //This class should never be initialised!
        assert false : "This class should never be initialised";
    }

    ...
}
2 голосов
/ 20 июля 2009

Почему бы вам просто не положить этот класс в банку, которая будет развернута. Таким образом, он будет там во время компиляции, но если кто-то попытается получить к нему доступ во время выполнения, вы получите ClassNotFoundException.

2 голосов
/ 20 июля 2009

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

class Dummy {
    //no-op
}
2 голосов
/ 20 июля 2009

Вы можете обойти компилятор примерно так:

public class Dummy {

    static {
        if (true) 
            throw new IllegalStateException("Do not use this class!");
    }
}

Но это было бы обманом; -)

1 голос
/ 20 июля 2009

Использовать AssertionError вместо IllegalStateException

0 голосов
/ 20 июля 2009

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

0 голосов
/ 20 июля 2009

Вы можете использовать свой собственный ClassLoader и сверять каждый класс с черным списком классов.

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