Right way to implement getExtensionAttributes()

I can partially answer my own question as I found out that the way the method is implemented in Magento\Catalog\Model\Product is definitely wrong and can lead to nasty bugs:

If there is no extension_attributes data yet, i.e. _getExtensionAttributes() returns null, the method returns an empty instance of the extension attributes interface.

This is good to fulfill the explicit contract and prevents "Call to a member function on null" errors but it always returns a new empty instance, which does not fulfill the implicit contract, namely that I get an extension attributes container for this specific instance.

That means:

$product->getExtensionAttributes()->setStockItem($stockItem);
var_dump($product->getExtensionAttributes()->getStockItem());

outputs:

NULL

A better implementation would look like this:

public function getExtensionAttributes()
{
    $extensionAttributes = $this->_getExtensionAttributes();
    if (!$extensionAttributes) {
        $extensionAttributes = $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface');
        $this->_setExtensionAttributes($extensionAttributes);
    }
    return $extensionAttributes;
}

But why is it not used in other modules then? Is it against the new separation of data models that we see in the customer module? If so, how are we supposed to initialize the extension attributes?

To that, I still don't have an answer