Aggregates are associated only with DATA MODIFICATION . No two units should be allowed to change the same data. Because the Value object is immutable, it prevents this scenario. Therefore, for two or more aggregates it is quite normal to use the same Value object, since it is a read-only data structure, and the aggregate does not care about the reading model.
Address a = new Address("1111 ABC Ave."); person.setAddress(a); letter.setAddress(a); person.getAddress().change("2222 XYS Ave.")
The above will never happen for the address, and therefore it is not dangerous to share, because you do nothing with the Address of the person, you will never affect the letter, so the letter still protects its own invariants.
If an “Address” is assigned an entity, you cannot use the same address in both entities, since the above code will make the letter vulnerable to changes per person, and this will break the border, and this will not allow the letter to control its invariants.
This is the whole point of Aggregate Roots, it also models things in such a way as to limit side effects. If you define very clear boundaries for the modification, it will be easier to work with, and you will prevent potential harmful unexpected effects.
I will add one more thing. As mentioned in another answer, you want the other restricted context to have a different type of address. The reason for this is that the details that you need for an address in one context do not necessarily match what you need in another. Thus, having two types of addresses, one for each context, you highlight the needs of one of the needs of the other.
Say what you need:
Address { Number; Unit; Street; State; Country; PostalCode; }
But for the location you need:
Address { Number; Unit; Latitude; Longitude; }
DDD will say call them both addresses, but bind them to a different context. Therefore, although they all speak the language as an address, their specific data and behavior may differ depending on the context you are talking about. What you absolutely must not do is create a kind of MonsterAddres that will contain all the possible data and behavior of all contexts in your domain and have this type of address used in all contexts.
Please note that we are talking about the model in your application, it’s good to store all the address data in the Monster address table, but when modeling your application you should separate this into the logical restricted context that appears in your domain and the ubiquitous language that it uses.