Compound unique constraint with NULL values
If you can identify a value that will never be stored in the referenced tables (e.g. a negative value), you can use a unique index that uses expressions:

create unique index 
  on favorite_comments( coalesce(opinion_id,-1), coalesce(review_id, -1), list_id );


the coalesce() will turn all null values in the same "real" value, forcing a unique constraint violation when you try to insert another NULL value. 

The only drawback of a unique index compared to a unique constraint is, that the unique index can't be a target of a foreign key (while a unique constraint would be)