абстрактный метод массива заданной длины в Java? - PullRequest
1 голос
/ 13 октября 2010

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

Теперь я попытался сделать что-то подобное public abstract BaseAdapter[3] adapters();, но он жалуется с ошибкойчто это не может быть сделано таким образом.

это их другой способ, или мне нужно просто сделать public abstract BaseAdapter[] adapters();?

Это будет работать нормально, но подкласс все еще может передать массив больше, чем3 предмета

Ответы [ 7 ]

5 голосов
/ 13 октября 2010

Вы можете решить это так:

  • Создать абстрактный вспомогательный метод (который вы можете переопределить) с именем createAdapters() с типом возврата BaseAdapter[]

    protected abstract BaseAdapter[] createAdapters();
    
  • В вашем суперклассе у вас есть final метод adapters, который выполняет следующие действия:

    public final BaseAdapter[] adapters() {
        BaseAdapter[] adapters = createAdapters();
        if (adapters.length != 3)
            throw new Exception("Error: Please return 3 adapters.");
        return adapters;
    }
    

Другой альтернативой может быть создание простого класса с именем BaseAdapterTriple (возможно, с более описательным именем), содержащего три BaseAdapter, и использование его в качестве возвращаемого значения.

1 голос
/ 13 октября 2010

Насколько я знаю, нет способа наложить подобные ограничения на объекты в сигнатуре метода.Либо используйте исключения при реализации методов, либо используйте пользовательские классы.

0 голосов
/ 13 октября 2010

В Java размер массива не является частью его типа.Или, другими словами, все типы массивов с заданным базовым типом одинаковы.Кроме того, вы не можете использовать метод signature , который накладывает ограничения на размер параметра или результата, введенного в массив.

Это означает, что у вас остается кодирование метода тестирования (в вашем случае) длина массива, который он собирается вернуть.Это, вероятно, не очень вам поможет, так как я предполагаю, что вы пытаетесь использовать статическую типизацию для обеспечения «тройственности» ваших массивов.С этой точки зрения ответ @matt b на деньги, хотя вы могли бы сделать это таким образом, чтобы получить массивы (длиной 3):

public class AdapterTriple {
    private Adapter[] adapters;
    /**
     * This constructor may throw an exception
     */
    public AdapterTriple(Adapter[] adapters) {
        if (adapters.length != 3) {
            throw new IllegalArgumentException("array length is wrong");
        }
        this.adapters = adapters;
    }
    /**
     * This constructor won't throw an exception (apart from Errors)
     */
    public AdapterTriple(Adapter adapter1, Adapter adapter2, Adapter adapter3) {
        this.adapters = adapters = new Adapters[] {
                adapter1, adapter2, adapter3};
    }
    /**
     * @return an array of 3 adapters.
     */
    public Adapter[] {
        return adapters;
    }
}

Таким образом, вы не можете применить ограничения размера массивастатически в Java.Вы должны делать это динамически, но вы можете предпринять шаги, чтобы избежать ошибок во время выполнения.

0 голосов
/ 13 октября 2010

ответ aioobe - это хороший подход, но я бы также предложил что-то немного другое:

Если вам требуется метод для возврата массива определенного размераВозможно, вы захотите спросить, почему массив является подходящим типом возврата для этого метода, а не с помощью простого POJO, который может легко инкапсулировать идею «3 BaseAdapters», то есть:

public class ThreeAdapters {
    BaseAdapter getAdapter1() { ...}
    BaseAdapter getAdapter2() { ...}
    BaseAdapter getAdapter3() { ...}
}

Намного понятнее всем, кто вовлечен, если вы инкапсулируете идею «вернуть 3 адаптера» в свой собственный класс, чтобы его можно было использовать в качестве возвращаемого типа (конечно, вы можете найти более подходящее имя для класса).

0 голосов
/ 13 октября 2010

Если вам нужен метод adapters(), который может возвращать не более 3 BaseAdapter максимум и имеющий подклассы для реализации «возврата» при соблюдении контракта 3max, вы должны выполнить проверку в вашем методе adapters(), вызвать метод abstract.

Например:

abstract class YourAbstractClass{
    public BaseAdapter[] adapters(){
        BaseAdapter[] adapters = internalAdapters();
        if(adapters.length > 3){
            throw new IllegalStateException();
        }
        return adapters;
    }

    protected abstract BaseAdapter[] internalAdapters();
}
0 голосов
/ 13 октября 2010

Нет, вы не можете делать это ни с массивами, ни со списками.Вы можете вызвать исключение, если число превышает 3, и задокументировать это поведение.

0 голосов
/ 13 октября 2010

Вы, кажется, неправильно понимаете значение модификатора abstract в Java.

abstract применяется к классам и методам , а не к полям / переменнымТо, что вы пытаетесь, не может работать.

Пожалуйста, опишите, чего вы хотите достичь, тогда мы можем помочь: -).

См., например, http://download.oracle.com/javase/tutorial/java/IandI/abstract.html для объяснения abstract.

...