Atributos protegidos ou privados?

Para um boa prática de programação OO, numa classe deve haver atributos protegidos ou privado?

Isso é uma coisa muito relativa Zalmen! Não existe uma verdade absoluta, você deve utilizar aquilo que for mais conviniente, de acordo com a situação.
De uma forma geral, todo atributo que só seja significativo para aquela classe deve ser privado.
Um atributo ou método protegido pode ser utilizado em uma classe abstrata por exemplo, para que ele seja acessível às suas subclasses (e tambem às demais classes do package, nao se esqueca)

Quanto mais privado for o atributo, maior o controle que você terá sobre ele, evitando que outras classes o utilizem de forma inconsistente.

eu gosto muito do protected quando enxergo que seria interessante alguem extender a classe. mas se meu metodo getter o setter executa algo a mais alem de apenas setar e pegar o dado, ai eu deixo private para forcar a subclasse a passar pelo metodo

em algum lugar do site da sun, ele avisa que quando alguem usa muito protected, eh porque ou ele entende muito de OO, ou porque nao entende nada…

O complicado é que às vezes hoje você não está precisando fazer nenhum tipo de validação ou qualquer ação relacionada ao atributo, mas aí chega um dia que isso muda, e então se o seu atributo não era private pode ser “tarde demais”, e vai ter que fazer a alteração em um monte de classes.

Dê uma olhada neste tutorial:

http://www.jspbrasil.com.br:8081/jspbrasil/certificacao/modificadores.jsp