1

Мой метод query облегчает запросы к моему уровню сохранения с использованием org.hibernate.Session. Вот код метода:@SafeVarargs в методе vararg с общим типом возврата

Это вызывает следующее предупреждение:

Тип безопасности: Потенциал загрязнения кучи через переменные аргументы параметров exampleEntities

Безопасно ли использовать @SafeVarargs аннотацию в этом случае?

Как я понимаю, до тех пор, пока я не инициализирую местный Object[] с exampleEntities, тогда я в порядке. Но это не кажется правильным.

Этот метод является аналогичен методу java.util.Collections.addAll упомянутого в the Java Specification §9.6.3.7, который аннотированной с @SafeVarargs. This answer обсуждает предупреждение о том, что в целом следующий код безопасен:

@SafeVarargs 
void foo(T... args) { 
    for (T x : args) { 
     // do stuff with x 
    } 
} 

Но мой query метод имеет вид:

<T> List<T> query(T... args) { 
    Foo foo = new Foo(); 
    for (T x : args) { 
     foo.add(x); 
    } 
    return (List<T>) foo.list(); 
} 

Итак, есть случай, когда @SafeVarargs аннотацию бы не быть безопасным?

ответ

0

Да, вы можете использовать @SafeVarargs. Можно ли использовать @SafeVarargs, зависит от того, как вы используете параметр varargs exampleEntities. Если вы полагаетесь на свой фактический тип времени выполнения, являющийся E[], то вы не можете использовать @SafeVarargs, но если вы полагаетесь только на его элементы, которые являются E, то вы можете использовать @SafeVarargs.

Здесь вы перебираете только exampleEntities и получаете E. Это соответствует @SafeVarargs.

Смежные вопросы