2016-06-29 1 views
0

Java Версия: 1,6Как отправить несколько объектов с одним и тем же состоянием на метод с одним параметром Object с помощью Java?

У меня есть несколько компонентов с аналогичной структурой

ClassBean1 { 
    String firstName; 
    String middleName; 
    String lastName; 
} 



UtilClass { 

    public static void concatName(ClassBean1 object) { 
     String fullName = object.firstName + object.middleName + object.lastName; 
     System.out.println(fullName); 
    } 

} 

Mainclass { 
    UtilClass.concatName(newClassBean1) 
} 

Теперь я получаю еще один боб класс с такой же структурой, как в ClassBean1; Скажет ClassBean2

ClassBean2 { 
    String firstName; 
    String middleName; 
    String lastName; 
} 

Я хочу изменить UtilClass.concatName таким образом, что он работает на все объекты с ПгвЬЫатом, MiddleName & LastName. Я сделал следующие изменения:

UtilClass { 

    public static void concatName(Object object) { 
     String fullName = object.firstName + object.middleName + object.lastName; 
     System.out.println(fullName); 
    } 

} 

Но это дает ошибки времени компиляции. Может ли кто-нибудь помочь в разрешении !!!

Я не мог тронуть существующий bean i.e ClassBean1. Таким образом, новый код я могу позаботиться о создании базового класса и производных фондов; но реорганизуйте его так, чтобы существующий код работал

+1

Каковы эти ошибки времени компиляции? (Кроме того, если у вас есть общий интерфейс, почему бы не использовать a, erm, common 'Interface'?) – doctorlove

+2

« Что это за ошибки компиляции? » @doctorlove ... Я предполагаю, что это связано с тем, что объект не имеет поля под названием «firstName» и т. д. – Fildor

+0

@doctorlove: он говорит, что не может найти имя, фамилию, второе имя – fatherazrael

ответ

1

Вам необходимо создать базовый класс с элементами и методом, из которых вы хотите получить все остальные классы, в базовом классе определить имена и метод concatName, затем каждый объект, полученный из этого, наследует членов и функцию, и он будет работать.

+0

Спасибо. BUt Если вы забудете о базовом классе и сосредоточитесь на UtilClass, то как мы можем модифицировать метод UtilClass, чтобы какой-либо объект имел такое же состояние – fatherazrael

+1

, вы должны проверить состояние при вызове метода. –

+2

. Все, что вам нужно сделать, это сделать вашу функцию экземпляр базового класса, тогда все объекты, которые его называют производными от базы, будут работать - полиморфизм – SPlatten

1

Создать родительский класс с этими тремя переменными, наследуют другие классы, которые будут использовать эти 3 из этого родительского класса, чем:

public static void concatName(Parent object) { 
    String fullName = object.firstName + object.middleName + object.lastName; 
    System.out.println(fullName); 

}

1

И если вы действительно хотите сделать это без createing базовый класс, единственный способ, которым я могу придумать, - это отражение. Это ужасно, вы можете иметь объект как параметр метода. Затем в вашем методе вы можете использовать отражение, чтобы увидеть, есть ли все необходимые методы и вызвать их для получения данных.

Но это очень уродливо и не следует пытаться. Лучшим способом будет либо базовый класс, либо общий интерфейс, как это было предложено ранее.

+0

Можете ли вы дать мне фрагмент для этого же? Поскольку я не хочу использовать Object, а затем экземпляр. Я не мог сделать базовый класс; так что это не подходит для меня. – fatherazrael

+1

Ну, так же, как и уродливый «экземпляр» и кастинг. Если вы считаете это отражение, то неразумно. – Fildor

+0

Но я не могу использовать instanceOf и кастинг, предположим, что 10 объектов имеют одинаковые поля. (Я НЕ МОЖЕТ ИЗМЕНИТЬ ЛЮБОЕ ИЗ ИХ), и я делаю 11-й и рефакторинг существующего класса UTIL. то как я могу сделать так, чтобы все эти 10 объектов тоже работали, и мой объект тоже работал. – fatherazrael

1

Вы можете проверить с помощью instanceof

public static void concatName(Object object) { 

     if(object instanceof ClassBean1){ 
      ClassBean1 b1 = (ClassBean1) object; 
      String fullName = b1.firstName +b1.middleName + b1.lastName; 
      System.out.println(fullName); 
     } else if(object instanceof ClassBean2){ 
      ClassBean2 b2 = (ClassBean2) object; 
      String fullName = b2.firstName +b2.middleName + b2.lastName; 
      System.out.println(fullName); 
     } 

} 
0

Вы можете иметь метод в классе Util, который будет принимать три параметра и вызывать этот метод из основного класса.

UtilClass {

государственной статической силы concatName (String FirstName, String MiddleName, String LastName) { Строка FULLNAME = Firstname + MiddleName + LastName; System.out.println (fullName); }

}

MainClass { UtilClass.concatName (newClassBean1.getFirstName() + newClassBean1.getMiddleName() + newClassBean1.getLastName()) // для второго класса UtilClass.concatName (newClassBean2.getFirstName() + newClassBean2.getMiddleName() + newClassBean2.getLastName()) }

1

Вы можете использовать отражение для получения полей/переменных класса.

Передача bean-компонента любого типа, имеющего общее состояние i.e общие переменные, которые вы хотите использовать в функции UtilClass, и использовать самый базовый класс для каждого объекта, который является классом Object в качестве параметра для того же метода. Теперь извлеките объект класса из этой переменной и примените методы отражения, чтобы получить значения переменных.

public static void concatName(Object object) { 

    // 
    Class clazz = object.getClass(); 

    String fullName = null; 
    try { 
     fullName = clazz.getDeclaredField("firstName").get(object) +" "+ clazz.getDeclaredField("middleName").get(object) + " " +clazz.getDeclaredField("lastName").get(object); 
    } catch (IllegalArgumentException | IllegalAccessException 
      | NoSuchFieldException | SecurityException e) { 
    } 

    System.out.println(fullName); 


} 

При таком подходе вы можете получить требуемый результат без полиморфизма/наследования или изменить классы бобов.

Смежные вопросы