{"record":{"id":"d6cf8ceff2c58508","repo":"Blankj/AndroidUtilCode","slug":"u-can-t-instantiate-me-d6cf8c","errorCode":null,"errorMessage":"u can't instantiate me...","messagePattern":"u can't instantiate me\\.\\.\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java","lineNumber":26,"sourceCode":"import androidx.annotation.RequiresApi;\nimport androidx.annotation.RequiresPermission;\n\nimport static android.Manifest.permission.VIBRATE;\n\n/**\n * <pre>\n *     author: Blankj\n *     blog  : http://blankj.com\n *     time  : 2016/09/29\n *     desc  : utils about vibrate\n * </pre>\n */\npublic final class VibrateUtils {\n\n    private static Vibrator vibrator;\n\n    private VibrateUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * Vibrate.\n     * <p>Must hold {@code <uses-permission android:name=\"android.permission.VIBRATE\" />}</p>\n     *\n     * @param milliseconds The number of milliseconds to vibrate.\n     */\n    @RequiresPermission(VIBRATE)\n    public static void vibrate(final long milliseconds) {\n        Vibrator vibrator = getVibrator();\n        if (vibrator == null) return;\n        vibrator.vibrate(milliseconds);\n    }\n\n    /**\n     * Vibrate.\n     * <p>Must hold {@code <uses-permission android:name=\"android.permission.VIBRATE\" />}</p>","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/Blankj/AndroidUtilCode/blob/7b4caf9e5440046b3fefb63b6b6e2ead7ebaf809/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java#L8-L44","documentation":"VibrateUtils is a final static-only utility for device vibration, holding a static Vibrator reference. Its private constructor throws UnsupportedOperationException to prevent instantiation. All public methods (vibrate, cancel, getVibrator) are static.","triggerScenarios":"Reflective instantiation via VibrateUtils.class.getDeclaredConstructor().setAccessible(true).newInstance(), or transitively through Gson/Jackson deserialization, Mockito/PowerMock, Kotlin reflection, or a DI classpath scan.","commonSituations":"Serialization frameworks binding a field to VibrateUtils; mock frameworks in tests; coverage probes; accidental `new VibrateUtils()` after weakening modifiers.","solutions":["Use static methods: VibrateUtils.vibrate(ms) (with VIBRATE permission held) instead of constructing.","Provide a Gson InstanceCreator / Jackson mixin returning a sentinel so the constructor is not invoked.","Use Mockito.mockStatic for mocking rather than constructing VibrateUtils.","Keep the class final with a private constructor."],"exampleFix":"// before\nVibrateUtils vu = new VibrateUtils();\n\n// after\nVibrateUtils.vibrate(200);","handlingStrategy":"validation","validationCode":"if (Modifier.isFinal(VibrateUtils.class.getModifiers())) {\n  throw new IllegalStateException(\"VibrateUtils is static-only.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Call VibrateUtils.vibrate(...) statically; hold the VIBRATE permission.","Register InstanceCreator/mixin for JSON fields.","Use Mockito.mockStatic for mocking.","Keep final + private constructor."],"tags":["android","utility-class","reflection","instantiation","vibration"],"backgroundTag":null,"analyzedSha":"7b4caf9e5440046b3fefb63b6b6e2ead7ebaf809","analyzedAt":"2026-08-14T02:26:54.956Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}