# Interface Record

All Known Implementing Classes:
  `DefaultRecord`

@UML(identifier="Record", specification=ISO_19103) public interface Record
A list of logically related elements as (name, value) pairs in a dictionary. A record may be used as an implementation representation for features.

This class can be think as the equivalent of the Java `Object` class.

Since:
  2.1
See Also:
  - `RecordType`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `Map<MemberName, Object>`
  `getAttributes()`
  Returns the dictionary of all (name, value) pairs in this record.
  `RecordType`
  `getRecordType()`
  Returns the type definition of record.
  `Object`
  `locate(MemberName name)`
  Returns the value for an attribute of the specified name.
  `void`
  `set(MemberName name, Object value)`
  Sets the value for the attribute of the specified name.

- ## Method Details

  - ### getRecordType

    @UML(identifier="recordType", obligation=OPTIONAL, specification=ISO_19103) RecordType getRecordType()
    Returns the type definition of record. All attributes named in this record must be defined in the returned record type. In other words, the following relationship must holds:

    - `getRecordType().getMemberTypes().containsAll(getAttributes().keySet())`

    This method can be think as the equivalent of the Java `Object​.getClass()` method.

    Returns:
      The type definition of this record, or `null`.

  - ### getAttributes

    @UML(identifier="memberValue", obligation=MANDATORY, specification=ISO_19103) Map<MemberName, Object> getAttributes()
    Returns the dictionary of all (name, value) pairs in this record. The returned map shall not allows key addition. It may allows the replacement of values for existing keys only.
    Returns:
      The dictionary of all (name, value) pairs in this record.
    See Also:
      - `RecordType​.getMemberTypes()`

  - ### locate

    @UML(identifier="locate", obligation=MANDATORY, specification=ISO_19103) Object locate(MemberName name)
    Returns the value for an attribute of the specified name. This is functionally equivalent to `getAttributes().get(name)`. The type of the returned object is given by `getRecordType().getMemberTypes().get(name)`.
    Parameters:
      `name` - The name of the attribute to lookup.
    Returns:
      The value of the attribute for the given name.
    See Also:
      - `RecordType​.locate(MemberName)`

  - ### set

    void set(MemberName name, Object value) throws UnsupportedOperationException
    Sets the value for the attribute of the specified name. This is functionally equivalent to `getAttributes().put(name,value)`. Remind that `name` keys are constrained to record type members only.
    Parameters:
      `name` - The name of the attribute to modify.
      `value` - The new value for the attribute.
    Throws:
      `UnsupportedOperationException` - if this record is not modifiable.