私は3つのクラス、抽象的なユーザと2つの特定のものを持っています:異なる(国内、国際、カスタムなど)可能な1つ以上のAddressオブジェクトのArrayListを保持するNormalUser trueを返すメソッドを持つAdminクラス。彼らはどちらもお互いに無関係なより多くのメソッドを含んでいます。私は、例えば次のように4ユーザーオブジェクトを作成する場合は、別のクラスの今 Java継承とinstanceofの定数使用を避ける
abstract class User{
public User(String username, String pw){
...
}
public class NormalUser extends User{
...
private ArrayList<Address> addresses;
...
public void addAdress(ArrayList<Address> address){
addresses.addAll(address);
}
public class Admin extends User{
...
public boolean getIsAdmin(){
return true;
}
}
:
ArrayList<User> users;
users.add(new NormalUser("1", "pw");
users.add(new NormalUser("2", "pw");
users.add(new NormalUser("3", "pw");
users.add(new NormalUser("4", "pw");
users.add(new Admin("5", "pw"));
users.add(new NormalUser("6", "pw");
そして、私はNormalUserでaddAddressメソッドを使用したいと言う、私はにspecficユーザーをダウンキャストする必要がありますNormalUserへのユーザー、私はこのようなNormalUserでaddAddressメソッドを使用する前に:
私はNormalUserと管理者の両方がユーザーになりたい理由は、私はそれらを処理することができそうです
if (user instanceof NormalUser){
NormalUser normal = (NormalUser) user;
normal.addAddress(...)
}
一緒にログインするとき。
UserクラスにaddEmailを追加し、それをNormalUserクラスで上書きすることを考えましたが、NormalUserクラスのすべてのメソッドに対してこれを行う必要があります。さらに、Adminはそれをユーザーがその機能を必要としないときも同様です。
質問1:instanceofの使用が悪いと聞いたので、これを行うには良い方法がありますか? NormalUserクラスに固有のメソッドを使用するたびにinstanceofを使用する必要があります。
Quesiton 2:オブジェクトアドレスのArrayListは、RegularUserを特定のアドレス/(オブジェクト)にリンクする最適な方法ですか?
現在データベースはありません。ユーザCは、国内およびなど
おかげカスタムアドレスを持っている、
ですから、例えば、ユーザAが2つのアドレス国内1および国際的なものを持っており、ユーザBは、単に国内のアドレスを持っています。
PS。以前の投稿を広範囲に検索しましたが、解決策が見つかりませんでした。どちらのJavaの本でも、どちらもinstanceofの使用例を示していますが、悪いことは言及されていません。
この具体的なケースについては、私は本当にどちらが良いかは言えませんが、「instanceof」は定義上悪いことではありません。多型性がより適切な場合には、それを過度に使用すべきではありません。 –
'instanceof'に関連する:基本的な' User'で 'addAddress'を呼び出さないようにデザインを考え直すべきです。 'NormalUser'のために特別に設計されたコードブロックにいるときだけ、このようなメソッドを呼び出すべきです。 – toto2
アドミニストレーターにアドレスがないのはなぜですか? – soulcheck