Java

爪哇島、咖啡
實在是太冗贅了

Java 觀念 - final 關鍵字

📓 此篇不是很完整,隨時會有很大的變動

final 在 Java 是一個關鍵字,出現在不同的 Code 上有不同的用途。

出現在 class 上

代表此 class 不能被他類繼承。

刻意繼承會出現 Compile error。

出現在方法上

代表此方法不可以被重寫(Override)

刻意重寫會出現 Compile error。

出現在變數上

代表此變數不可以被重新賦值。刻意重新賦值會出現 Compile error。

但是如果該變數被指到一個物件上,物件的實際內容(狀態)仍然可以被改變,因為 fianl 在變數上只是定義是否可以重新賦值。

其他

JDA 抓取 Discord Forum Channel 內的 Thread 清單

Code 範例

public class Main extends ListenerAdapter {

    public static final String TOKEN = "<BOT_TOKEN_HERE>";
    public static final String SERVER_ID = "<SERVER_ID_HERE>";
    public static final String PROJECT_FORUM_ID = "<FORUM_ID_HERE>";

    public static void main(String[] args) throws InterruptedException {
        JDA jda = JDABuilder.createDefault(Main.TOKEN).build();

        jda.addEventListener(new Main());
    }

    @Override
    public void onReady(ReadyEvent event) {
        System.out.println("Bot is ready");
        JDA jda = event.getJDA();

        Guild server = jda.getGuildById(SERVER_ID);
        assert server != null;
        ForumChannel channel  = server.getForumChannelById(PROJECT_FORUM_ID);
        assert channel != null;
        System.out.printf("Channel name: %s%n", channel.getName());
        List<ThreadChannel> threadChannels = channel.getThreadChannels();

        for(ThreadChannel thread : threadChannels){
            System.out.printf("Thread: %s%n", thread.getName());
        }
//        如果要正常關閉 Bot 的話需要以下指令
//        jda.shutdown();
    }
}

解釋

注意

Java 觀念 - Type Casting

Type Casting 跟物件繼承很有關係,只要子類別繼承父類別,那他們就有 Casting 的關係。

直接看以下範例:

class Animal {
    void speak(){
        System.out.println("Default speak");
    }
}

class Bird extends Animal {
    @Override
    void speak() {
        System.out.println("ㄐㄐ");
    }
}

class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("吉娃娃");
    }
}

public class main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Bird bird = new Bird();
        Dog dog = new Dog();

        animal.speak();
        bird.speak();
        dog.speak();

        // Upcasting and Downcasting

        Animal animal2;
        animal2 = bird; // Upcasting
        animal2.speak(); // works normally

        Bird bird2;
//        bird2 = animal; // Down casing, compile error
//        bird2 = (Bird)animal; // Compile pass
//        bird2.speak(); // but throw ClassCastException error

        Dog dog2;
//        dog2 = bird; // Obviously not working for compiling
//        dog2 = (Dog)bird; // Cannot casting to another child class, compile error.
    }
}