**Source URL:** https://general.veevavault.dev/vault-sdk/shared-code/uds.md



User-defined services (UDS) allow you to wrap reusable logic into a service
that can be used by other Vault Java SDK code, such as triggers, actions, or
[user-defined classes](/vault-sdk/shared-code/udc/). Much like Vault Java SDK
services, UDS are stateless singletons whose methods, once exited, return their
allocated memory to the maximum memory execution limit: only the method parameters and return
value counts toward the memory limit. Since UDS are stateless, nothing is
retained beyond the service method execution.

UDS only execute by calls from other classes, differentiating them from Vault
extensions that execute when a user or the system initiates an operation.

Locate the user-defined service using `ServiceLocator`, just like Vault Java
SDK services. Once located, execute the service with a normal Java method call.

## User-Defined Services vs. User-Defined Classes {#UDS_vs_UDC}

Unlike [user-defined classes](/vault-sdk/shared-code/udc/), the memory UDS use in
their methods is freed up when the method exits. Only the method return value
counts towards the total SDK extension memory limit. However, it is important
to note that just like SDK services, UDS do not store any data after the method
exits. If data needs to be stored, or if common methods need to be shared
between triggers or actions, a [user-defined class](/vault-sdk/shared-code/udc/)
should be used.

## Using User-Defined Services {#Using_User_Defined_Services}

To use a UDS, extend `UserDefinedService` and create a class implementing the
`UserDefinedService` extension. The following examples illustrate how to
perform a product search with a UDS.

Create a new service by extending `UserDefinedService` and using the
`@UserDefinedServiceInfo` annotation.

```
@UserDefinedServiceInfo
public interface ProductSearchClass extends UserDefinedService {
    boolean doesProductExist();
}

```

Implement the new interface that includes reusable code.

```
@UserDefinedServiceInfo
public class ProductSearchClassImpl implements ProductSearchClass {
    @Override
    public boolean doesProductExist() {
        // Reusable code
        return true;
    }
}

```

Locate the service and execute method from a Vault extension such as a trigger
or an action.

```
ProductSearchClass productSearchClass = ServiceLocator.locate(ProductSearchClass.class);
boolean productExists = productSearchClass.doesProductExist();

```

## Debugging User-Defined Services {#Debugging_UDS}

When the SDK debugger is attached to a Vault session, the UDS executes on the
client side, just like a [user-defined class](/vault-sdk/shared-code/udc/).
Therefore, for any SDK invocations the service makes, the size of the objects
returned by the invocations counts towards memory usage. The memory used by
those objects is not decremented when the service method exits.

Objects returned by the service method do not count towards the Vault extension
memory limit when the SDK debugger is attached to a Vault session.



---

**Previous:** [User-Defined Models](/vault-sdk/shared-code/udm)  
**Next:** [SDK Integrations](/vault-sdk/sdk-integrations)