2016-04-21 12 views
2

Я создаю приложение для Android, которое использует файл aar, который имеет класс, который использует шаблон построителя. Тем не менее, я подозреваю, что это простая старая проблема Java.Не удается вызвать вызов метода для шаблона построителя с скомпилированным внутренним классом

Все работает отлично, если я не использовать какие-либо из сцепленных сеттеров:

ProjectConfig config = new ProjectConfig$Builder("reqparam0") 
         .build() // this works fine 

Однако, когда я пытаюсь использовать любой из сцепленных сеттеров,

ProjectConfig config = new ProjectConfig$Builder("reqParam0") 
         .contactEmail("optParam0") 
         .build() // ERROR - can't find build() method 

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

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

Вот класс:

public class ProjectConfig { 
    private final String apiKey; 
    private final boolean batterySavingMode; 
    private final String contactEmail; 

    public ProjectConfig(Builder builder) { 
    apiKey = builder.apiKey; 
    batterySavingMode = builder.batterySavingMode; 
    contactEmail = builder.contactEmail; 
    } 

    public String getApiKey() { 
    return apiKey; 
    } 

    public boolean isBatterySavingMode() { 
    return batterySavingMode; 
    } 

    public String getContactEmail() { 
    return contactEmail; 
    } 

    public static class Builder{ 
    // Required parameters 
    private String apiKey; 

    // Optional parameters 
    private boolean batterySavingMode = false; 
    private String contactEmail = null; 

    public Builder(String apiKey){ 
     this.apiKey = apiKey; 
    } 

    public Builder batterySavingMode(boolean enabled){ 
     this.batterySavingMode = enabled; 
     return this; 
    } 

    public Builder contactEmail(String contactEmail) { 
     this.contactEmail = contactEmail; 
     return this; 
    } 

    public ProjectConfig build(){ 
     return new ProjectConfig(this); 
    } 
} 

}

Может кто-нибудь пролить некоторый свет на то, что может быть причиной проблемы?

+0

Я предлагаю вам разместить соответствующий код и полную ошибку. –

+0

Шаблон Builder реализуется обычным способом, при этом цепные методы возвращают «это». Кроме того, моя IDE говорит, что метод chained возвращает 'ExampleClass.Builder', а не 'ExampleClass $ Builder' – Cognitio

+0

Обычно '$' относится к внутреннему классу, а не к публичному классу. Но, не видя соответствующего кода, я откажусь от этого вопроса –

ответ

0

Это на самом деле ошибка времени компиляции. Методы, которые IDE не может найти, краснеют и говорят: «Невозможно разрешить метод».

Однако, как представляется, это ошибка с IDE ... по крайней мере, метод найден во время выполнения, потому что я его протестировал, и все идет гладко, когда приложение запускается.

Я даже проверил отладчик, и объект ProjectConfig создан с правильными значениями, даже для метода, который, по его словам, не может быть разрешен.

Так что кажется, что это было бы лучше, как сообщение об ошибке в JetBrains ...